在使用Spring Integration和RabbitMQ时,如何在消费者端处理格式错误的消息

时间:2015-03-24 08:30:42

标签: java spring rabbitmq spring-integration

我目前正在开展一个涉及从RabbitMQ brocker消费消息的项目。但是,我仍然是Spring Integration,AMQP和RabbitMQ的新手。 我在使用格式错误的邮件格式时遇到问题。当我的消费者收到格式错误的消息时,它会将其返回队列,然后RabbitMQ将其发回,这会创建一个无限循环。 在Spring Integration文档中,有一些配置可以实现,因为这种消息不会返回到队列。

但是我无法理解如何实现它。 我想要的是能够配置某种格式为

的bean
class 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 但不幸的是我无法理解任何事情。

所以,如果你有一个示例代码或一个发送它的链接,我会很有意思。

3 个答案:

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