如何保存消息队列并拥有一组没有轮询的工作线程?

时间:2010-03-18 12:31:54

标签: java spring spring-integration

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

                                         / Worker 1 \
=Request Channel= -> [Holding Queue|||] -> Worker 2 -> =Response Channel=
                                         \ Worker 3 /

那是:

  • 请求进入并进入FIFO队列
  • 相同的工作人员然后从队列中挑选任务
  • 在任何特定时间,任何工人只能完成一项任务
  • 当工作人员空闲且保持队列非空时,工作人员应立即接受另一项任务
  • 当任务完成后,工作人员将结果放在Response Channel

我知道Spring Integration中有QueueChannel个,但这些通道需要轮询(这似乎不是最理想的)。特别是,如果工人忙碌,我希望工人忙碌。

另外,我考虑完全避开队列,只是简单地让任务循环到所有工作人员,但最好只有一条等待线,因为某些任务可能比其他任务更快完成。此外,我想了解剩余的工作数量(我可以从队列中获得)以及取消所有或特定工作的能力。

如何在避免轮询的同时实现此消息排队/工作分配模式?

编辑:看起来我正在寻找Message Dispatcher pattern - 如何使用Spring / Spring Integration实现这一点?

2 个答案:

答案 0 :(得分:3)

在Spring Integration 2.0.0中,我们已将<dispatcher/>子元素添加到<channel/>元素中。您可以使用它来确保异步切换而不使用轮询器。

这下面使用了java.util.concurrent。

<channel id="shareableWork">
    <dispatcher task-executor="pool"/>
</channel>
<thread-pool-task-executor id="pool" max-size="3"/>

答案 1 :(得分:2)

也许您应该从并发包中查看ExecutorService类。