【问题标题】:requeue the message in rabbitmq using Spring ampq使用 Spring amqp 在 rabbitmq 中重新排队消息
【发布时间】:2015-07-08 00:26:33
【问题描述】:

我是 rabbitmq 的新手,正在尝试以下场景

--> 生产者发送消息
--> 消费者收到消息
-- 执行我自己的逻辑

如果逻辑失败 - 重新排队

--> 如果消费者失败(机器宕机)则重新排队消息

我已经使用 Spring rabbitTemplate 实现了基本的发送者

rabbitTemplate.convertAndSend(.....);

对于消费者,我实现了一个消息监听器

public class CustomMessageListener implements MessageListener {
@Override
    public void onMessage(Message message) {
       //** my own logic**
   }
}

并通过spring将其添加到容器中

  <bean id="aListener" class="com.sample.CustomMessageListener" autowire="byName"/>

 <rabbit:listener-container id="myListenerContainer" connection-factory="connectionFactory"  acknowledge="auto" prefetch="750" concurrency="5" >
    <rabbit:listener ref="aListener" queues="reportQueue"/>
</rabbit:listener-container>

在这部分之前它工作正常。

现在如果**我自己的逻辑**在侦听器中提到失败。我想重新排队消息。我该如何实现这一点。从我浏览过的博客来看,returnMessage 似乎需要被覆盖。但我不确定如何通过监听器来完成。

【问题讨论】:

    标签: spring rabbitmq rabbitmq-exchange spring-rabbit


    【解决方案1】:

    使用acknowledge="auto",在监听器正常退出之前,消息不会被确认,所以你不需要做任何额外的事情;如果您的侦听器抛出异常或服务器崩溃,则消息将保留在队列中。

    【讨论】:

    • 感谢您的快速回复。在“n”次尝试后,是否有属性或方法可以忽略消息或将消息发送到死信队列。 (假设将指定 n)
    • 将retry interceptor 添加到听众的advice-chain。使用RejectAndDontRequeueRecoverer 配置拦截器,当重试用尽时将调用该拦截器;如果原始队列如此配置,消息将被发送到 DLX/DLQ。或者,您可以使用RepublishMessageRecoverer 直接将附加信息(例如异常的堆栈跟踪)重新发布到另一个队列。请参阅the documentation 了解更多信息。
    • 默认恢复只是记录并正常退出,因此消息只是记录并丢弃。
    猜你喜欢
    • 2016-12-13
    • 2017-01-23
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多