我使用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
}
谢谢! 大师
答案 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事务回滚。