Обработка ошибок с помощью Http Outbound Gateway в Spring Integration - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь понять, как следует обрабатывать ошибки в Spring Integration. Я нашел документацию о errorChannel, я пытался использовать ее, но исключение не поймано.

Вот мой исходящий HTTP-шлюз:

<int-http:outbound-gateway id="orderRequestHttpGateway"
                               request-channel="orders-channel"
                               url="${url}"
                               http-method="POST"
                               expected-response-type="java.lang.String"
                               reply-timeout='5000'
                               reply-channel='pushed-channel'
                               charset="UTF-8">
</int-http:outbound-gateway>

Я не понимаю, где я должен ловить исключения, выдаваемые этим компонентом (например, ошибка HTTP 500)

Маршрут начинается с poller. Я попытался добавить свойство error-channel:

<int:inbound-channel-adapter channel="orders-trigger-channel" expression="''">
        <int:poller fixed-delay="${poller}" error-channel="errorChannel"/>
</int:inbound-channel-adapter>

Я пытался с пользовательским каналом ошибки Я также попытался переопределить существующий errorChannel:

<int:channel id="errorChannel"/>
<int:outbound-channel-adapter id="errorChannelHandler"
                               ref="errorManager"
                               method="foo"
                               channel="errorChannel"/>

Пока я продолжаю получать MessageHandlingException, и я не могу поймать их, чтобы иметь с ними дело должным образом.

1 Ответ

0 голосов
/ 02 июля 2018

Вы ловите исключение только в потоке вызывающего или в том месте, где у вас есть try...catch - в Spring Integration нет ничего отличного от чистого Java: мы ловим исключение всякий раз, когда у нас есть try...catch.

Согласно вашему описанию, error-channel="errorChannel" на <poller> - это путь, и если у вас нет какого-либо другого потока, смещающегося вниз по потоку, такой MessageHandlingException действительно отбрасывается на устройство опроса и переносится в ErrorMessage для отправки на этот errorChannel настроенный.

Это MessageHandlingException, потому что мы имеем дело с Messaging в Spring Integration, и такое исключение несет некоторую контекстную и важную информацию о потоке и сообщении о сбое. Ваш 500 HTTP error является просто cause в этом сообщении. Поэтому, когда вы ловите и обрабатываете ErrorMessage, вы должны взглянуть на его трассировку стека для анализа информации.

С другой стороны, вы можете сузить область для обработки ошибок с помощью ExpressionEvaluatingRequestHandlerAdvice или RequestHandlerRetryAdvice: https://docs.spring.io/spring-integration/docs/5.0.6.RELEASE/reference/html/messaging-endpoints-chapter.html#message-handler-advice-chain

...