1

我正在研究能够处理来自 RabbitMQ 的消息的工作人员。

但是,我不确定如何做到这一点。

如果我收到一条消息并且在处理过程中发生错误,我如何将消息放入队列的末尾?

我正在尝试使用 nack 或拒绝,但消息总是重新放在第一个位置,其他消息保持冻结!

我不明白为什么必须将消息放在第一位,我正在尝试“玩”其他选项,例如 requeue 或 AllupTo,但它们似乎都不起作用。

先感谢您!

4

2 回答 2

1

文档说:

消息可以使用具有 requeue 参数(basic.recover、basic.reject 和 basic.nack)的 AMQP 方法返回到队列,或者由于通道关闭而持有未确认的消息。对于 2.7.0 之前的 RabbitMQ 版本,任何这些情况都会导致消息在队列后面重新排队。从 RabbitMQ 2.7.0 版开始,消息始终按发布顺序保存在队列中,即使存在重新排队或通道关闭。

在 2.7.0 及更高版本中,如果队列有多个订阅者,单个消费者仍然可以观察到乱序的消​​息。这是由于可能重新排队消息的其他订阅者的行为造成的。从队列的角度来看,消息始终按发布顺序保存。

记住ack您成功的消息,否则它们将不会从队列中删除。

如果您需要更多地控制被拒绝的邮件,您应该看看死信交换

于 2016-12-29T03:00:55.737 回答
-3

nack 或 reject 丢弃消息或重新排队消息。

对于您的要求,以下可能是合适的,

一旦消费者收到消息,就在开始处理它之前,将 ack() 发送回 rabbitmq 服务器。

然后处理消息,如果在过程中发现任何错误,则将相同的消息发送(发布)到同一个队列中。这会将消息放在队列的后面。

成功处理后什么也不做。ack() 已经发送到rabbitmq 服务器。只需接收下一条消息并进行处理。

于 2016-12-29T07:17:17.853 回答