我在我的消费者内部抛出 AmqpException 。
我的期望是消息将以 FIFO 顺序返回到队列,并在将来的某个时候重新处理。
Spring AMQP 似乎没有将消息释放回队列。而是尝试一遍又一遍地重新处理失败的消息。
这会阻止处理新到达的消息。卡住的那些在 AMQP 控制台中永远处于“未打包”状态。
有什么想法吗?
这就是rabbitmq/Spring AMQP的工作方式;如果消息被拒绝(抛出任何异常),则默认情况下该消息将重新排队并放回到队列的头部,以便立即重试。
... 将来某个时候重新处理。
您必须进行适当的配置才能实现这一点。
首先,您必须告诉代理不要重新排队消息。这是通过设置完成的defaultRequeueRejected
在侦听器容器上设置为 false(默认情况下为 true)。或者,你可以抛出一个AmqpRejectAndDontRequeueException
它指示容器拒绝(而不是重新排队)单个消息。
但这还没有结束。这样做只会导致被拒绝的消息被丢弃。
为了避免这种情况,你必须设置一个死信交换/队列对于队列 - 被拒绝的消息将被发送到 DLX/DLQ,而不是被丢弃。通常建议使用策略而不是队列参数。
最后,您可以设置消息在 DLQ 上的生存时间,以便在该时间之后,该消息将从队列中删除。如果您在以下位置设置了另一个适当的死信交换that队列(DLQ),您可以在时间到期后将消息重新排队回原始队列。
请注意,这仅适用于原始队列中被拒绝的交付;当该队列中的消息过期时它将不起作用。
See 这个答案以及其问题中的一些链接以获取更多详细信息。
您可以使用以下内容x-death
header 来决定在一定次数的尝试后是否应该完全放弃(捕获异常并以某种方式处理坏消息;不要抛出异常,容器将确认消息)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)