Multithreading Spring集成任务调度程序块是否为任务执行器中的所有线程都忙
如果taskExecutor中的所有线程都忙(全部100个)。轮询器使用的线程是否会阻塞?或者轮询器线程是否会将消息留在队列中,并在300毫秒后重试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" >
<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
策略。