Java 使用Spring Integration和RabbitMQ时,如何在用户端处理格式错误的消息
我目前正在从事一个项目,涉及使用来自RabbitMQ brocker的消息。然而,我对Spring集成、AMQP和RabbitMQ仍然是新手。 我在使用格式错误的消息时遇到问题。当我的消费者收到一条格式错误的消息时,它会将其返回队列,然后RabbitMQ将其发送回队列,这将创建一个无止境的循环。 在Spring集成文档中,可以实现一些配置,以确保此类消息不会返回队列 然而,我无法理解如何实现这一点。 我想要的是能够配置某种具有如下格式的beanJava 使用Spring Integration和RabbitMQ时,如何在用户端处理格式错误的消息,java,spring,rabbitmq,spring-integration,Java,Spring,Rabbitmq,Spring Integration,我目前正在从事一个项目,涉及使用来自RabbitMQ brocker的消息。然而,我对Spring集成、AMQP和RabbitMQ仍然是新手。 我在使用格式错误的消息时遇到问题。当我的消费者收到一条格式错误的消息时,它会将其返回队列,然后RabbitMQ将其发送回队列,这将创建一个无止境的循环。 在Spring集成文档中,可以实现一些配置,以确保此类消息不会返回队列 然而,我无法理解如何实现这一点。 我想要的是能够配置某种具有如下格式的bean class ExceptionHandler {
class ExceptionHandler {
public void handle(Throwable e ) {
Logger.log("Some log ... we don't give a Sh** ... ") ;
}
}
我查过了
及
但不幸的是,我什么都不懂
所以,如果你有一个示例代码或一个链接发送它,我将不胜感激 在多次尝试失败后,我能够处理错误。然而,我现在正努力隐藏异常日志。我不明白为什么要这样实施。我也能处理日志问题。 结果是,有另一种方式可以表示您不想返回消息,因为它具有
acknowledge mode=“NONE”
属性。结帐区。这样你甚至不需要抛出那个丑陋的异常
< 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.
}
}
导入org.springframework.util.ErrorHandler;
导入org.springframework.amqp.AmqpRejectAndDontRequeueException;
公共类MessagesErrorHandler实现ErrorHandler{
@凌驾
公共无效句柄错误(可丢弃可丢弃){
System.out.println(“Yessssssss错误已处理!!!!”);
抛出新的AmqpRejectAndDontRequeueException(throwable);//这非常重要
//这样消息就不会返回队列。
}
}
AmqpRejectAndDontRequeueException是向容器发出的一个信号,用于拒绝消息,而不是重新请求消息;默认情况下,它会重新请求任何异常
或者,您可以手动连接SimpleMessageListenerContainer
bean;将defaultRequeueRejected
设置为false
,并使用container
属性将其添加到适配器中。然后,所有异常都会导致消息被拒绝,而不会重新查询
另外,您可以使用错误通道而不是
错误处理程序,从错误流中抛出AmqpRejectAndDontRequeueException
。是的,这是正确的解决方案之一-当您决定消息不应重新查询时,抛出AmqpRejectAndDontRequeueException
在SimpleMessageListenerContainer
上还有defaultRequeueRejected
,默认情况下为true
您可能应该看看解决方案,以避免丢失这些格式错误的消息
请分享困扰你的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.
*/
}
你能提供如何使用spring?对不起,我没听清楚。“做”什么?您的MessagesErrorHandler
已经使用AmqpRejectAndDontRequeueException
执行了这些操作。你还需要什么?