Поток Task Executor не возвращается в пул в случае исключения
Когда во вложенной цепочке происходит сбой и она достигает потока канала ошибок, потоки исполнителя задач блокируются и не возвращаются в пул. Есть ли способ указать, что конец потока достигнут и их нужно вернуть в пул.
например сплиттер разбивает полезную нагрузку на 3 сообщения. Сообщения обслуживаются как -
message 1 - fileChannelTaskExecutor1
message 2 - fileChannelTaskExecutor2
если вызов шлюза с "вложенной цепочкой" успешен, 3-е сообщение доставляется любому из этих потоков исполнителя, который освобождается ранее.
Однако, если вызов шлюза с "вложенной цепочкой" завершается неудачно и достигает значения 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>
1 ответ
Проблема здесь заключается в одностороннем nullChannel
и <int:gateway>
природа запроса / ответа.
Даже если вы отправите исключение на error-channel
Вы должны повторно бросить его на вызов или вернуть некоторые compensation
сообщение из потока ошибок. В противном случае вы в конечном итоге будете висеть на воротах, которые ждут ответа вечно. По умолчанию конечно!
Вы можете настроить reply-timeout
по этому вопросу и выпустите ваш поток в пул через некоторое время в случае односторонней ошибки.