【发布时间】:2021-04-27 03:43:04
【问题描述】:
我有一个 spring 集成工作流,它在其通道中嵌入了任务执行器,以便启用并发处理。我通过网关手动启动处理,并且需要阻塞主线程,直到所有异步进程都完成。有没有办法做到这一点?我尝试过沿着屏障、闩锁和通道拦截器的思路思考,但没有解决方案即将到来。有什么想法吗?
【问题讨论】:
标签: spring concurrency spring-integration terminate
我有一个 spring 集成工作流,它在其通道中嵌入了任务执行器,以便启用并发处理。我通过网关手动启动处理,并且需要阻塞主线程,直到所有异步进程都完成。有没有办法做到这一点?我尝试过沿着屏障、闩锁和通道拦截器的思路思考,但没有解决方案即将到来。有什么想法吗?
【问题讨论】:
标签: spring concurrency spring-integration terminate
查看参考手册中的聚合器部分: http://static.springsource.org/spring-integration/docs/latest-ga/reference/htmlsingle/#aggregator
如果聚合器位于网关的下游,则网关调用者可以阻塞(或使用 Future,如果这被定义为网关接口上的返回类型),直到聚合器接收并释放相关的消息组,即使那些在不同的线程上异步处理。
本质上,Aggregator 本身就是一个屏障,它的默认释放策略本质上是一个基于消息组序列大小的倒计时锁存器。
希望对您有所帮助。 -马克
【讨论】:
为了回答我自己的问题,这就是我最终要做的:
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);
}
希望这可以帮助其他面临类似问题的人。
【讨论】: