2017-04-06 112 views
1

我想处理不成功的消息,消费者从队列中获取并重新排队它们。Nack并拒绝在RabbitMQ

想象我有这样的情况:

P => | foo | bar | baz | => C 

其中foo,酒吧和巴兹的消息。

如果消费者读baz但不顺心的事我既可以使用basic.rejectbasic.nackhttps://www.rabbitmq.com/nack.html)。使用这两个命令中的一个,我会传递参数来重发消息。

问题是消息在与之前相同的位置重新排队,所以下一条消息将再次为baz

我想重新排队,但将其发送回队列的开头:

P => | baz | foo | bar | => C 

我与我的应用程序的一些代码行解决,但是,我不知道有没有更好的解决方案存在可能使用直接使用RabbitMQ的一些功能。

回答

1

你可以采取死信队列(DLQ)一看:https://www.rabbitmq.com/dlx.html

+0

是的,我读了整个文档昨天。这不是我正在寻找的,但显​​然我寻找的东西不存在,死信队列可以是一个很好的解决方法。 – xyzale

+0

这里的队列(FIFO)的行为与预期完全一致,因为您正在使用手动确认模式,所以线程将等待直到获得确认,因为它无法处理,因此它会尝试以循环方式放入相同的位置。另一方面,一次又一次地处理不良信息是没有意义的。重试2-3次(spring-amqp有直接支持),如果仍然失败,请将其重新分类,以便以后可以分析错误消息的格式并直接与客户团队联系。 – lambodar

+0

可能是您可以将TTL添加到您的失败消息并放入DLX,因此一旦它过期,它将自动移动到主队列。 – lambodar