带弹簧amqp的rabbitmq - 在AmqpException情况下卡住的消息

Vla*_*mir 4 amqp rabbitmq spring-amqp

我在我的消费者中抛出一个AmqpException.我的期望是消息将以FIFO顺序返回队列,并在将来的某个时间进行重新处理.

似乎Spring AMQP不会将消息释放回队列.但是反而尝试一遍又一遍地重新处理失败的消息.这会阻止处理新到达的消息.被卡住的那些永远出现在AMQP控制台内的"解包"状态.

有什么想法吗?

Gar*_*ell 7

这就是rabbitmq/Spring AMQP的工作方式; 如果消息被拒绝(抛出任何异常),则默认情况下将消息重新排队,并将其放回队列的头部,以便立即重试.

......将来的某个时候再加工.

您必须适当地配置以实现这一目标.

首先,您必须告诉经纪人不要重新排队.这是通过将defaultRequeueRejected侦听器容器设置为false(默认情况下为true)来完成的.或者,您可以抛出一个AmqpRejectAndDontRequeueException指示容器拒绝(而不是重新排队)单个消息的东西.

但那不是它的结束; 这样做只会导致被拒绝的消息被丢弃.

为避免这种情况,您必须为队列设置死信交换/队列 - 然后将被拒绝的消息发送到DLX/DLQ而不是丢弃.通常建议使用策略而不是队列参数.

最后,您可以在DLQ上设置消息时间,这样,在此之后,消息将从队列中删除.如果在队列(DLQ)上设置另一个适当的死信交换,则可以使该消息在时间到期后重新排队回原始队列.

请注意,这仅适用于原始队列中拒绝的交付; 当该队列中的消息过期时,它将不起作用.

有关更多详细信息,请参阅此答案以及其问题中的一些链接.

你可以使用x-death标题的内容来决定你是否应该在经过一些尝试后完全放弃(捕获异常并以某种方式处理坏消息;不要抛出异常,容器会响应消息).