2015-08-08 3 views
0

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

<bean id="errorQ" class="com.ibm.mq.jms.MQQueue"> 
    <constructor-arg value="${error.queue}" /> 
</bean> 
<bean id="inQ" class="com.ibm.mq.jms.MQQueue"> 
    <constructor-arg value="${inbound.queue}" /> 
</bean> 

<int:channel id="error" /> 
<int:channel id="inbound" /> 

<int-jms:message-driven-channel-adapter 
    id="jmsIn" channel="inbound" container="messageListenerContainer" 
    acknowledge="transacted"></int-jms:message-driven-channel-adapter> 

<int-jms:outbound-channel-adapter id="jmsError" 
channel="error" connection-factory="mqConnectionFactory" 
destination="errorQ" delivery-persistent="true"></int-jms:outbound-channel-adapter> 


<int:service-activator id="service" 
input-channel="inbound" ref="messageListener" method="someMethodInListerner"> 
    <int:request-handler-advice-chain> 
     <ref bean="retryWithBackoffAdviceSession" /> 
    </int:request-handler-advice-chain> 

<bean id="retryWithBackoffAdviceSession" 
    class="org.springframework.integration.handler.advice.RequestHandlerRetryAdvice"> 
    <property name="retryTemplate"> 
     <bean class="org.springframework.retry.support.RetryTemplate"> 
      <property name="backOffPolicy"> 
       <bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy"> 
        <property name="initialInterval" value="${initialInterval}" /> 
        <property name="multiplier" value="${multiplier}" /> 
        <property name="maxInterval" value="${maxInterval}" /> 
       </bean> 
      </property> 
      <property name="retryPolicy"> 
       <bean class="org.springframework.retry.policy.SimpleRetryPolicy"> 
        <property name="maxAttempts" value="${redelivery}" /> 
       </bean> 
      </property> 
     </bean> 
    </property> 
    <property name="recoveryCallback"> 
     <bean 
      class="org.springframework.integration.handler.advice.ErrorMessageSendingRecoverer"> 
      <constructor-arg ref="error" /> 
     </bean> 
    </property> 
</bean> 

ответ

1

Сообщение отправлено на error является ErrorMessage с полезной нагрузкой MessagingException.

MessagingException имеет два свойства cause и failedMessage.

Итак, если вы хотите отправить оригинальный недоставленное сообщение для errorQ, вам нужно будет добавить трансформатор к потоку ошибок ...

<int:transformer ... expression="payload.failedMessage" /> 

EDIT

<int:chain input-channel="error"> 
    <int:transformer expression="payload.failedMessage" /> 
    <int-jms:outbound-channel-adapter ... /> 
</int:chain> 

EDIT2

Как правило, при использовании этих методов используется usefu l сообщить причину неудачи. Вы можете добавить сообщение об исключении в качестве заголовка ...

<int:chain input-channel="error"> 
    <int:header-enricher> 
     <int:header name="failureReason" expression="payload.cause.message" /> 
    </int:header-enricher> 
    <int:transformer expression="payload.failedMessage" /> 
    <int-jms:outbound-channel-adapter ... /> 
</int:chain> 
+0

Привет, Гэри, добавлен код входного канала, а теперь уже выше, поэтому он обрабатывается потоком. Я понимаю ваш комментарий о добавлении трансформатора для отправки только исходной полезной нагрузки в очередь ошибок, но где мне нужно поместить это в поток? – Ashish

+0

Я думаю, что добавление трансформатора, передающего полезную нагрузку, должно работать? Ashish

+0

трансформатор с 'выражение =«полезной нагрузки»' не делает ничего - видеть мое редактирование , –

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