2

我有一个 spring 集成工作流,它在其通道中嵌入任务执行器,以便启用并发处理。我通过网关手动启动处理,并且需要阻塞主线程,直到所有异步进程都完成。有没有办法做到这一点?我尝试过沿着屏障、闩锁和通道拦截器的思路思考,但没有解决方案。有什么想法吗?

4

2 回答 2

2

查看参考手册中的聚合器部分:http: //static.springsource.org/spring-integration/docs/latest-ga/reference/htmlsingle/#aggregator

如果聚合器位于网关的下游,则网关调用者可以阻塞(或使用 Future,如果它被定义为网关接口上的返回类型),直到聚合器接收并释放相关的消息组,即使这些消息已在不同的线程异步。

本质上,聚合器本身就是一个屏障,它的默认释放策略本质上是一个基于消息组序列大小的倒计时锁存器。

希望有帮助。-标记

于 2013-07-06T12:36:42.560 回答
0

为了回答我自己的问题,这就是我最终做的事情:

  • 创建一个知道何时关闭的自定义 ExecutorService - 在我的情况下,这只是在释放最后一个活动线程时 - 即在执行工作流中的最后一部分之后:

public class WorkflowThreadPoolExecutor extends ScheduledThreadPoolExecutor {
    public WorkflowThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize);
    }

    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        super.afterExecute(r, t);

        if (getActiveCount() == 1) {
            shutdown();
        }
    }
}
  • 在主线程中等待执行程序终止,如下所示:

    try {
        executorService.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
    } catch (InterruptedException ex) {
        LOG.error("message=Error awaiting termination of executor", ex);
    }

希望这可以帮助其他面临类似问题的人。

于 2013-07-09T14:37:22.800 回答