将消息保留在队列中以便重试,直到成功处理

时间:2017-01-04 06:29:07

标签: spring rabbitmq amqp spring-amqp

我使用Spring amqp MessageListener实现来处理消息。 bean定义和工作示例如下。

public class AutomationMessageListenerServiceImpl implements MessageListener {

 public void onMessage(Message message) {
        EntityMessage message= null;
        try {
            message= jsonDeserializer.covertPayload(message.getBody());
            dispatchToHandler(message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}





<rabbit:listener-container connection-factory="rabbitConnectionFactory">
        <rabbit:listener queue-names="${listen.queue}" ref="messageListener"/>
    </rabbit:listener-container>

    <bean id="messageListener" class="com.tcl.gvg.itsm.automation.core.messaging.AutomationMessageListenerServiceImpl"/>

这里的问题是,我正在处理catch块中的所有错误,因此队列认为我成功处理了消息。但是,我不能抛出异常,因为父接口会引起问题,因为它不会抛出任何错误。

我是否有办法在不自行更改代码的情况下完成此操作?

2 个答案:

答案 0 :(得分:1)

目前尚不清楚你的意思

  

因为父方法会导致问题

容器调用onMessage()并且不涉及您的其他代码。在任何情况下,即使您将其重新排队,也会立即重新传递该消息。

对于像JSON格式错误这样的致命错误,您应该设置一个死信交换/队列,并通过抛出AmqpRejectAndDontRequeueException来将消息路由到那里。

或者,使用RabbitTemplate将错误消息发送到DLQ。

答案 1 :(得分:0)

我用RuntimeException包装了异常并将其抛给它的调用者。

catch (Exception e) {
            throw new RuntimeException(e);
}