Java 如何在没有轮询的情况下保持消息队列并拥有一组工作线程?
我有一个工作流,我希望它看起来像这样: / Worker 1 \ =Request Channel= -> [Holding Queue|||] -> Worker 2 -> =Response Channel= \ Worker 3 / /工人1\ =请求通道=->[等待队列| | |]->工作者2->=响应通道= \工人3/ 即:Java 如何在没有轮询的情况下保持消息队列并拥有一组工作线程?,java,spring,spring-integration,Java,Spring,Spring Integration,我有一个工作流,我希望它看起来像这样: / Worker 1 \ =Request Channel= -> [Holding Queue|||] -> Worker 2 -> =Response Channel= \ Worker 3 / /工人1\ =请求通道=->[等待队列| | |]->工作者2->=响应通道= \工人3/ 即: 请求进入并进入FIFO队列 然后,相同的工作人员从队列中拾取任务 在任何给定时
- 请求进入并进入FIFO队列
- 然后,相同的工作人员从队列中拾取任务
- 在任何给定时间,任何工人只能完成一项任务
- 当工作人员空闲且等待队列不为空时,工作人员应立即拿起另一个任务
- 当任务完成时,工作人员将结果放入
响应通道
QueueChannel
s,但这些通道需要轮询(这似乎不太理想)。特别是,如果一个工人可以很忙,我希望他能很忙
此外,我还考虑过完全避免排队,让任务循环分配给所有工作人员,但最好有一个单独的等待队列,因为有些任务可能比其他任务完成得更快。此外,我想了解还有多少作业(我可以从队列中获得)以及取消所有或特定作业的能力
如何在避免轮询的同时实现此消息队列/工作分布模式
编辑:看来我正在寻找--如何使用Spring/Spring集成实现这一点?也许您应该查看并发包中的ExecutorService类。在Spring Integration 2.0.0中,我们将
子元素添加到
元素中。您可以使用它来确保异步切换,而无需使用轮询器
下面使用java.util.concurrent
<channel id="shareableWork">
<dispatcher task-executor="pool"/>
</channel>
<thread-pool-task-executor id="pool" max-size="3"/>
如果您对处理要缓存的“工作”的线程感兴趣,可以使用
Executors.newCachedThreadPool()
,尽管这更多是一个实现/调优细节。