Spring Integrations Task Scheduler Block是Task Executor中的所有线程都忙吗

时间:2014-09-28 20:57:24

标签: multithreading spring spring-integration

如果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" />

1 个答案:

答案 0 :(得分:1)

行为取决于任务执行者的queue-capacity属性及其拒绝政策。

默认情况下,队列是无限制的,因此任务将排队,直到最终内存不足为止。

当存在有限队列大小并且没有可用线程且队列已满时,默认策略是抛出异常(默认拒绝策略为中止)。您可以将拒绝策略设置为CALLER_RUNS,在这种情况下,任务将在轮询器线程上运行。

Spring Integration提供CallerBlocksPolicy(它需要队列容量> 0)但任务命名空间不支持自定义策略,您需要将执行程序定义为<bean/>。< / p>

为了更加复杂,您可以申请advice to the poller and "skip" polls under your chosen conditions。从该链接可以看出,我们计划在不久的将来提供标准建议。