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
并在一段时间内将线程释放到池中,以防出现单向错误过程。
当嵌套链失败并到达错误通道流时,任务执行器线程会阻塞并且不会返回到池中。有什么方法可以表明流量已经结束,需要将它们返回到池中。
例如拆分器将有效负载拆分为 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
并在一段时间内将线程释放到池中,以防出现单向错误过程。