我目前正在开展一个涉及从RabbitMQ brocker消费消息的项目。但是,我仍然是Spring Integration,AMQP和RabbitMQ的新手。 我在使用格式错误的邮件格式时遇到问题。当我的消费者收到格式错误的消息时,它会将其返回队列,然后RabbitMQ将其发回,这会创建一个无限循环。 在Spring Integration文档中,有一些配置可以实现,因为这种消息不会返回到队列。
但是我无法理解如何实现它。 我想要的是能够配置某种格式为
的beanclass ExceptionHandler {
public void handle(Throwable e ) {
Logger.log("Some log ... we don't give a Sh** ... ") ;
}
}
我查看了3.9 Exception Handling部分 和3.15.3 Message Listeners and the Asynchronous Case 但不幸的是我无法理解任何事情。
所以,如果你有一个示例代码或一个发送它的链接,我会很有意思。
答案 0 :(得分:1)
经过大量的尝试失败尝试后,我能够处理错误。但是我现在正在努力避免异常日志。我不明白为什么这样实现。我也能够处理日志问题。
它转变为有另一种方式可以表示您不希望将消息返回到具有acknowledge-mode="NONE"
属性的消息。结帐10.2 Inbound Channel Adapter部分。这样你甚至不需要抛出那个丑陋的例外。
< bean id="handler" class="MessagesErrorHandler"/>
< int-amqp:inbound-channel-adapter
error-handler="handler"
id="idActivityAdapter"
channel="channelName"
queue-names="activityQueue"
/>
import org.springframework.util.ErrorHandler;
import org.springframework.amqp.AmqpRejectAndDontRequeueException;
public class MessagesErrorHandler implements ErrorHandler {
@Override
public void handleError(Throwable throwable) {
System.out.println("YESSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS ERROR IS HANDLED !!!!");
throw new AmqpRejectAndDontRequeueException(throwable);// this very important
//so that message don't go back to the queue.
}
}
答案 1 :(得分:1)
是的,这是正确的解决方案之一 - 在您确定消息不应为AmqpRejectAndDontRequeueException
时抛出requeued
。
defaultRequeueRejected
上还有SimpleMessageListenerContainer
,默认为true
。
您可能应该查看DLX/DLQ解决方案,以免丢失那些格式错误的消息。
请分享困扰你的StackTrace。
SimpleMessageListenerContainer
中有这样的代码:
catch (AmqpRejectAndDontRequeueException rejectEx) {
/*
* These will normally be wrapped by an LEFE if thrown by the
* listener, but we will also honor it if thrown by an
* error handler.
*/
}
答案 2 :(得分:0)
AmqpRejectAndDontRequeueException
是容器拒绝并且不重新排队消息的信号;默认情况下,它会重新排列任何异常。
或者,您可以手动连接SimpleMessageListenerContainer
bean;将defaultRequeueRejected
设置为false
,然后使用container
属性将其添加到适配器。然后,所有异常都会导致邮件被拒绝而不会被重新排队。
此外,您可以使用错误通道而不是error-handler
来从错误流中抛出AmqpRejectAndDontRequeueException
。