Ошибка не передается в мой обработчик ошибок, пока мы используем диспетчер задач в Channel. - PullRequest
1 голос
/ 12 марта 2019

Ниже приведены фрагменты кода, в которых я пытаюсь обработать ошибку.

<int:channel id="errorGateWayChannel"></int:channel>
<int:service-activator ref="errorHandler"
        input-channel="errorGateWayChannel" />
...
<int:service-activator.. />
<int-http:outbound-gateway ..>
<int:channel id="routerInputChannel">
<int:dispatcher task-executor="sharedPool"/></int:channel>
<int:header-enricher input-channel="routerInputChannel" output-channel="routerInputChannel1">
        <int:error-channel ref="errorGateWayChannel"/>
    </int:header-enricher>

<int:recipient-list-router input-channel="routerInputChannel1" 
    default-output-channel="nullChannel">

<int:recipient channel="datasetInputChannel"/>
</int:recipient-list-router>
<int:service-activator id="datasetInputChannelSA" input-channel="datasetInputChannel"/> <!-- now this service activator giving me error -->

Теперь, если активатор службы «datasetInputChannelSA» выдает какое-либо исключение, я получаю WARN, и это не распространяется на канал ошибки.

WARN org.springframework.messaging.core.GenericMessagingTemplate $ TemporaryReplyChannel - получено ответное сообщение, но получающий поток уже получил ответ: ErrorMessage [payload = org.springframework.messaging.MessageHandlingException: исключение nested.lang.RuntimeException:

Я вижу похожие потоки, где они получают предупреждение, но не нашли, как с этим справиться.

Обновление: После предоставления overwrite = "true" в "int: error-channel" оно работает и решает мою проблему.

<int:error-channel ref="errorGateWayChannel"/>
to
<int:error-channel ref="errorGateWayChannel" overwrite="true"/>

1 Ответ

0 голосов
/ 12 марта 2019

Ваша конфигурация недостаточно полная, чтобы играть с нашей стороны, поэтому было бы здорово иметь какой-нибудь небольшой проект от вас где-нибудь на GitHub, чтобы позволить нам воспроизвести проблему, если таковая.

Однако, если вы хотите обрабатывать ошибки из datasetInputChannelSA и у вас нет других проблем, вам следует рассмотреть возможность использования <request-handler-advice-chain> для этого <service-activator> и включить ExpressionEvaluatingRequestHandlerAdvice с его trapException как true. Там вы можете настроить failureChannel для перехвата сервисных исключений и обработки их в получателе этого канала: https://docs.spring.io/spring-integration/docs/current/reference/html/#expression-advice

Уже поздно устанавливать заголовок error-channel в контексте Executor: сообщение о сбое не будет обращаться к нижестоящим заголовкам. Итак, ваша ошибка распространяется на заголовок TemporaryReplyChannel, заполненный вызовом шлюза восходящего потока (хотя не показан в вашем фрагменте кода ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...