2

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

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

那是:

  • 请求进来并进入 FIFO 队列
  • 然后相同的工作人员从队列中提取任务
  • 在任何给定时间,任何工人只能完成一项任务
  • 当一个工作人员空闲并且持有队列非空时,工作人员应该立即拿起另一个任务
  • 任务完成后,工作人员将结果放在Response Channel

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

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

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

编辑:看来我正在寻找Message Dispatcher 模式——如何使用 Spring/Spring 集成来实现它?

4

2 回答 2

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"/>
于 2010-05-08T11:15:46.803 回答
2

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

于 2010-03-18T12:44:34.707 回答