Task Executor 线程在异常情况下不会返回到池中

Task Executor thread is not returned to pool in case of exception

当嵌套链失败并到达错误通道流时,任务执行器线程会阻塞并且不会返回到池中。有什么方法可以表明流量已经结束,需要将它们返回到池中。

例如拆分器将有效负载拆分为 3 条消息。消息作为 -

message 1 - fileChannelTaskExecutor1
message 2 - fileChannelTaskExecutor2

如果 "nested-chain" 网关调用成功,第 3 条消息将提供给较早释放的这些执行程序线程中的任何一个。

但是,如果 "nested-chain" 网关调用失败并到达 errChannel,则上述执行程序线程都会阻塞并且不会返回到池中。由于池中没有线程可用,因此不处理后续消息(消息 3)。

<bean id="fileChannelTaskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="2"/>
    <property name="daemon" value="false"/>
</bean>

<int:channel id="splitterResponseChannel">
    <int:dispatcher task-executor="fileChannelTaskExecutor"/>
</int:channel>

<int:splitter input-channel="splitterRequestChannel" output-channel="splitterResponseChannel" >

<int:chain input-channel="splitterResponseChannel">
    <int:gateway request-channel="nested-chain" error-channel="errChannel"/>
</int:chain>

<int:chain input-channel="errChannel" output-channel="nullChannel">
     .....
</int:chain>

这里的问题是单向 nullChannel<int:gateway> request/reply 性质。

即使您向 error-channel 发送异常,您也应该将其重新抛出到调用或 return 来自错误流的一些 compensation 消息。 否则你最终会挂在网关上,永远等待回复。默认情况下,当然!

您可以调整 reply-timeout 并在一段时间内将线程释放到池中,以防出现单向错误过程。