Spring集成并发 - 检测完成

时间:2013-07-06 08:46:21

标签: spring concurrency spring-integration terminate complete

我有一个Spring集成工作流程,它将任务执行程序嵌入其通道中,以便启用并发处理。我通过网关手动启动处理,需要阻塞主线程,直到所有异步进程都完成。有没有办法实现这个目标?我曾尝试过障碍,锁存器和通道拦截器的思路,但没有解决方案。任何人的想法?

2 个答案:

答案 0 :(得分:2)

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

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

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

希望有所帮助。 -Mark

答案 1 :(得分: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);
    }

希望这有助于其他人面临类似的问题。