Multithreading Spring集成任务调度程序块是否为任务执行器中的所有线程都忙

Multithreading Spring集成任务调度程序块是否为任务执行器中的所有线程都忙,multithreading,spring,spring-integration,Multithreading,Spring,Spring Integration,如果taskExecutor中的所有线程都忙(全部100个)。轮询器使用的线程是否会阻塞?或者轮询器线程是否会将消息留在队列中,并在300毫秒后重试 <int:channel id="tasksIn"> <int:queue capacity="50"/> </int:channel> <int:bridge input-channel="tasksIn" output-channel="taskProcessing" >

如果taskExecutor中的所有线程都忙(全部100个)。轮询器使用的线程是否会阻塞?或者轮询器线程是否会将消息留在队列中,并在300毫秒后重试

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

行为取决于任务执行者的
队列容量属性及其拒绝策略

默认情况下,队列是无界的,因此任务将一直排队,直到最终耗尽内存

当队列大小有界且没有可用线程且队列已满时,默认策略是引发异常(默认拒绝策略是中止)。您可以将拒绝策略设置为
CALLER\u RUNS
,在这种情况下,任务将在轮询器线程上运行

Spring Integration提供了一个
调用方BlocksPolicy
(它需要一个队列容量>0),但是任务名称空间不支持自定义策略,您需要将执行器定义为


要获得更高的复杂度,可以应用。从该链接中可以看出,我们计划在不久的将来提供一个标准建议。

谢谢Gary,这澄清了我的理解。相同的行为是否适用于轮询器上定义的任务执行者?在这种情况下,轮询器是否会交给任务执行器进行轮询?或者任务执行器是否执行轮询?轮询器是一个调度程序线程(来自
taskScheduler
bean)。如果不提供任务执行器,我们将使用
SyncTaskExecutor
,因此轮询将直接在调度程序线程上运行。如果您提供了一个任务执行器,则轮询将传递给它,因此要使用建议“跳过”轮询,您需要运行
CALLER\u
策略。