2015-02-03 3 views
2

Я поразвлечься тестирования Spring Integration, так что я создал этот поток (не очень трудно, и он работает как шарм):Spring Integration протоколирование ошибок

  • пользователь покупает книгу
  • Некоторые преобразования выполняется
  • Jms сообщение передается асинхронно

Но я имею вопрос: вы знаете, есть ли способ напечатать журнал, если исходящий канал-адаптер не? Меня не волнует, что операция публикации JMS терпит неудачу, потому что поток заканчивается, возвращая правильную загрузку книги, но показ журнала будет приятным, и я думаю, что я немного беспорядочен с обработкой ошибок Spring IO.

Заранее благодарен!

<si:channel id="purchaseBookInputChannel" /> 
<si:channel id="purchaseBookReplyChannel" /> 
<si:channel id="purchaseBookRoutingChannel" /> 
<si:channel id="purchaseBookJmsInputChannel" /> 

<si:chain id="purchaseBookChain" input-channel="purchaseBookInputChannel" output-channel="purchaseBookRoutingChannel"> 
    <si:service-activator ref="bookServiceActivator" method="purchase" /> 
    <si:transformer ref="bookTransformer" method="transform" /> 
</si:chain> 

<si:recipient-list-router id="purchaseBookRouter" input-channel="purchaseBookRoutingChannel" ignore-send-failures="true" > 
     <si:recipient channel="purchaseBookJmsInputChannel" /> 
     <si:recipient channel="purchaseBookReplyChannel" /> 
</si:recipient-list-router> 

<si-jms:outbound-channel-adapter channel="purchaseBookJmsInputChannel" connection-factory="connectionFactory" destination="bookQueue"> 
    <si-jms:request-handler-advice-chain> 
     <bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">    
      <property name="onFailureExpression" value="#exception" /> 
      <property name="failureChannel" ref="logginChannel" /> 
      <property name="trapException" value="true" /> 
     </bean> 
    </si-jms:request-handler-advice-chain> 
</si-jms:outbound-channel-adapter> 

<si:logging-channel-adapter id="logginChannel" level="WARN"/> 

UPDATE

Привет там, и спасибо за ваше время!

Я думаю, что я делаю что-то неправильно, потому что я тестирование/ошибки-канал запроса Обработчик-совет- цепи, и это то, что я получаю:

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

и это поведение, м ищет:

  • A JMS сообщение отправлено
  • JMS происходит ошибка и отформатирован журнал ошибок печатается
  • Книга куплена и поток заканчивается хорошо !!

Любая подсказка о том, как печатать журнал без прерывания потока ?. Если я использую свойство ignore-send-failures="true", поток игнорирует ошибку JMS, но журнал ошибок не печатается.

Имейте славный день!

+0

Я протестировал «ExpressionEvaluatingRequestHandlerAdvice» и «trapException» и отлично работает! Я обновил свой прилагаемый пример с этими изменениями, возможно, кто-то мог увлечься этим тестом. Спасибо за Вашу поддержку! –

ответ

0

Прежде всего, я думаю, что вы не правы.

Лучше бы опубликовать сообщение в JMS и только после этого вернуться к ответу. Таким образом, было бы лучше для реального приложения изменить порядок каналов для <si:recipient-list-router>.

С другой стороны, чтобы войти и подавить исключение из <si-jms:outbound-channel-adapter> следует добавить <request-handler-advice-chain> к этому адаптеру и обеспечить ExpressionEvaluatingRequestHandlerAdvice с failureChannel к <logging-channel-adapter>.

UPDATE

ExpressionEvaluatingRequestHandlerAdvice имеет trapException вариант.Установите его на true, и вы исключение из JMS не будут возвращены.

+0

Кроме того, если шлюз или опросчик начнет ваш поток, вы можете добавить к нему этот «канал ошибки», и вы можете обработать исключение в своем потоке ошибок. По умолчанию 'errorChannel' просто регистрирует исключение. –

+0

Спасибо за вашу помощь, я добавил дополнительную информацию –

+0

Добавил обновление моего ответа. –

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