如何在Spring Integration ErrorHandler中获取Message(payload)?

时间:2013-09-18 06:29:29

标签: spring

我使用DefaultMessageListenerContainer配置消息驱动通道适配器以从队列中读取消息,处理它并使用outbound-channel-adapter将其发布到不同的队列。 如果在将消息发布到出站队列时遇到任何异常(例如javax.jms.JMSException:消息超出最大大小),我想在errorHandler(DefaultMessageListenerContainer的属性)中处理它并通知接收方。

我能够在errorHandler中获取异常堆栈跟踪,但我不确定哪条消息导致该异常。有没有什么方法可以抓住导致errorHandler中的异常的消息/有效负载?

public class MyErrorHandler implements ErrorHandler {
public void handleError(Throwable t) {
        // Get the payload???
            // Log the exception
            // Notify the receiver
}

谢谢! 大师

2 个答案:

答案 0 :(得分:2)

以下代码可以使用

public class MyErrorHandler implements ErrorHandler {

   public void handleError(Throwable t) {

        if (throwable instanceof MessageHandlingException) {
            MessageHandlingException exception = (MessageHandlingException) throwable;
            if (exception != null) {
                Message<?> message = exception.getFailedMessage();
                payload = (String) message.getPayload();
            }
        }
   ...
}

答案 1 :(得分:2)

当您定义消息驱动通道适配器时,Spring Integration会自动向DefaultMessageListenerContainer添加错误处理程序。错误出现在名为“errorChannel”的通道上,您可以像处理Spring Integration中的任何其他消息一样处理这些错误。只需在配置中的任何位置添加名为“errorChannel”的通道,您就可以从那里添加组件。

http://docs.spring.io/spring-integration/reference/htmlsingle/#namespace-errorhandler

请记住,处理错误将成功完成任何正在进行的JMS事务,因此请记住在处理完JMS事务后将其抛出,以便JMS事务回滚。