我有一个Spring集成工作流程,它将任务执行程序嵌入其通道中,以便启用并发处理。我通过网关手动启动处理,需要阻塞主线程,直到所有异步进程都完成。有没有办法实现这个目标?我曾尝试过障碍,锁存器和通道拦截器的思路,但没有解决方案。任何人的想法?
答案 0 :(得分:2)
查看参考手册中的聚合器部分: http://static.springsource.org/spring-integration/docs/latest-ga/reference/htmlsingle/#aggregator
如果聚合器位于网关的下游,网关调用者可以阻止(或使用Future,如果它被定义为网关接口上的返回类型),直到聚合器收到并释放相关的消息组,即使这些消息也是如此。在异步处理不同的线程。
本质上,聚合器本身就是一个障碍,它的默认发布策略本质上是一个基于消息组序列大小的倒计时锁存器。
希望有所帮助。 -Mark
答案 1 :(得分:0)
要回答我自己的问题,这就是我最终要做的事情:
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);
}
希望这有助于其他人面临类似的问题。