Проблема JMS с интеграцией Spring

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

<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>

person Ashish    schedule 08.08.2015    source источник


Ответы (1)


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

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

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

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

ИЗМЕНИТЬ

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

ИЗМЕНИТЬ2

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

<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>
person Gary Russell    schedule 08.08.2015
comment
Привет, Гэри, теперь выше добавлен код входного канала, поэтому он обрабатывается в потоке. Я понимаю ваш комментарий о добавлении преобразователя для отправки только исходной полезной нагрузки в очередь ошибок, но где мне нужно поместить это в поток? - person Ashish; 09.08.2015
comment
Я думаю, что добавление трансформатора, передающего полезную нагрузку, должно работать? ‹int:transformer input-channel=входящий выходной канал=выражение ошибки=полезная нагрузка/› - person Ashish; 09.08.2015
comment
Трансформатор с expression="payload" вообще ничего не делает - см. мою правку. - person Gary Russell; 09.08.2015
comment
Извините, я пропустил, что вы использовали повторное восстановление, но преобразователь тот же, потому что восстановитель также создает ErrorMessage. - person Gary Russell; 09.08.2015
comment
Может быть полезно зафиксировать причину сбоя и передать ее в виде заголовка в errorQ. - person Gary Russell; 09.08.2015