如果taskExecutor中的所有线程都忙(全部100个)。轮询器使用的线程是否会阻塞?或者轮询器线程将消息留在队列中并在另外300ms再次尝试?
<int:channel id="tasksIn">
<int:queue capacity="50"/>
</int:channel>
<int:bridge input-channel="tasksIn" output-channel="taskProcessing" >
<int:poller fixed-rate="300" max-messages-per-poll="2" />
</int:bridge>
<int:channel id="taskProcessing">
<int:dispatcher task-executor="executor"/>
</int:channel>
<service-activator input-channel="taskProcessing" output-channel="taskCompleteChannel" ref="taskProcessor" method="processTask"/>
<task:executor id="executor" pool-size="100" />
答案 0 :(得分:1)
行为取决于任务执行者的queue-capacity
属性及其拒绝政策。
默认情况下,队列是无限制的,因此任务将排队,直到最终内存不足为止。
当存在有限队列大小并且没有可用线程且队列已满时,默认策略是抛出异常(默认拒绝策略为中止)。您可以将拒绝策略设置为CALLER_RUNS
,在这种情况下,任务将在轮询器线程上运行。
Spring Integration提供CallerBlocksPolicy
(它需要队列容量> 0)但任务命名空间不支持自定义策略,您需要将执行程序定义为<bean/>
。< / p>
为了更加复杂,您可以申请advice to the poller and "skip" polls under your chosen conditions。从该链接可以看出,我们计划在不久的将来提供标准建议。