代码之家  ›  专栏  ›  技术社区  ›  Mark Elliot

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

  •  2
  • Mark Elliot  · 技术社区  · 16 年前

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

    • 然后相同的工作人员从队列中提取任务
    • 在任何时候,任何工人只能从事一项工作
    • 当一个工人有空并且等待队列非空时,工人应该立即接另一个任务
    • 任务完成后,工作人员将结果放在 Response Channel

    QueueChannel 但是这些通道需要轮询(这似乎不太理想)。特别是,如果一个工人可以很忙,我希望他能很忙。

    另外,我也考虑过完全避免排队,让任务循环分配给所有员工,但是最好有一个单独的等待队列,因为有些任务可能比其他任务完成得更快。此外,我想了解还有多少作业(我可以从队列中获得)以及取消所有或特定作业的能力。

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

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

    2 回复  |  直到 16 年前
        1
  •  3
  •   iwein    16 年前

    在SpringIntegration2.0.0中,我们添加了 <dispatcher/> <channel/> 元素。您可以使用它来确保异步切换,而无需使用轮询器。

    下面使用java.util.concurrent。

    <channel id="shareableWork">
        <dispatcher task-executor="pool"/>
    </channel>
    <thread-pool-task-executor id="pool" max-size="3"/>
    
        2
  •  2
  •   M. Jessup    16 年前

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