2015-04-12 7 views
2

Я читал, что если в потоке выбрано исключение, первое, что сделает инфраструктура, это заголовок сообщения об ошибке для свойства error-channel. Это всегда так?Обработка ошибок/распространение в интеграции с весной

В моем конкретном случае я назначаю собственный канал ошибок для заголовка сообщения, и, тем не менее, сообщение, похоже, распространяется по потоку до ближайшего обработчика ошибок/канала ошибок.

<int:chain id="buildAggregatedResponseChain" input-channel="aggregatedResultChannel" 
       output-channel="sendAggregatedChannel"> 
     <int:header-enricher> 
      <int:error-channel ref="myErrorChannel"/> 
     </int:header-enricher> 
     <int:service-activator ref="service" method="doSomething"/> 
    </int:chain> 

я явно сгенерирует исключение внутри DoSomething но исключение никогда не заканчивается в myErrorChannel. Вместо этого он «распространяется» на ближайший ErrorHandler вверх по потоку или на канал ошибки, указанный для потока для int-mail: imap-idle-channel-adapter (пробовал несколько разных потоков). Что я пропущу? Может быть, кто-то может выделить основной принцип обработки ошибок/распространения ошибок (например, когда речь идет о нескольких транзакциях и т. Д.)? Существует некоторая информация, но она довольно разрозненна и не систематическая.

ответ

2

Это зависит от потока вверх по течению; если есть асинхронная эстафетная передача обслуживания, с которым связан заголовок; в противном случае исключение возвращается к входящей конечной точке.

В целом, я бы посоветовал не модифицировать заголовки фреймов, такие как errorChannel. Вместо этого поставьте error-channel на входящую конечную точку (например, ваш адаптер idap idle) и обработайте ошибки в этом потоке.

Изменение заголовков напрямую редко требуется. Если Вы хотите вставить другую обработки ошибок в середине потока, то вы можете вставить шлюз обмена сообщениями ...

<int:service activator ... ref="gw" /> 

<int:gateway id="gw" default-request-channel="..." 
    error-channel="midFlowErrorChannel" /> 

Если поток вниз по течению (от шлюза) не возвращает никакого результата на успех, то не забудьте добавить тайм-аут ответа по умолчанию 0 (или использовать пользовательский интерфейс службы с методом, который возвращает void).

+0

«Если вы хотите вставить различную обработку ошибок в середине потока, тогда вы можете вставить шлюз обмена сообщениями» - это то, что я хотел бы спросить о следующем :) – yuranos87

Смежные вопросы