首页 文章

在Spring AMQP中处理无法传递的消息给消费者

提问于
浏览
2

在这种情况下,由于客户端的不当处理,消息拒绝将其自身传递给消费者,因此该消息在服务器和客户端之间无限地反弹,导致连续的日志消息流填满磁盘空间 .

如何避免这种情况?或者换句话说,如何将重试限制在有限的次数?

我尝试用兔子模板重试模板,但没有成功 . 请在下面找到配置:

<rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" reply-timeout="10" retry-template="retryTemplate"/>

<bean id="retryTemplate" class="org.springframework.retry.support.RetryTemplate">
<property name="backOffPolicy">
    <bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy">
        <property name="initialInterval" value="500" />
        <property name="multiplier" value="10.0" />
        <property name="maxInterval" value="10000" />
    </bean>
</property>
</bean>

我在这篇文章中提到了我的问题:Handling AMQP messages gracefully with spring-amqp

1 回答

  • 3

    使用带有兔子模板的重试模板用于重试 publishing 消息,与消费无关(除非您使用的是 template.receive() .

    要向侦听器容器添加重试和中止,请参阅the documentation . 您需要向侦听器容器添加重试拦截器's advice chain; if your messages don' t具有消息ID,您必须使用无状态重试,因为框架需要知道重试消息的次数并且amqp不提供该信息 .

    请参阅discussion,了解重试耗尽时要执行的操作 . 默认情况下,只记录和删除消息,但您可以配置适当的恢复器 . RejectAndDontRequeueRecoverer 将拒绝它,并且可以配置兔子将消息发送到死信交换/队列 . 或者,您可以使用 RepublishMessageRecoverer 将消息写入另一个队列,包括有关失败的信息 .

    有关示例,请参见this question/answer . 但请注意,使用带有随机消息ID的状态恢复将不起作用 .

相关问题