Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在没有轮询的情况下保持消息队列并拥有一组工作线程?_Java_Spring_Spring Integration - Fatal编程技术网

Java 如何在没有轮询的情况下保持消息队列并拥有一组工作线程?

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队列 然后,相同的工作人员从队列中拾取任务 在任何给定时

我有一个工作流,我希望它看起来像这样:

/ Worker 1 \ =Request Channel= -> [Holding Queue|||] -> Worker 2 -> =Response Channel= \ Worker 3 / /工人1\ =请求通道=->[等待队列| | |]->工作者2->=响应通道= \工人3/ 即:

  • 请求进入并进入FIFO队列
  • 然后,相同的工作人员从队列中拾取任务
  • 在任何给定时间,任何工人只能完成一项任务
  • 当工作人员空闲且等待队列不为空时,工作人员应立即拿起另一个任务
  • 当任务完成时,工作人员将结果放入
    响应通道
我知道Spring Integration中有
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()
,尽管这更多是一个实现/调优细节。