我正在研究能够处理来自 RabbitMQ 的消息的工作人员。
但是,我不确定如何做到这一点。
如果我收到一条消息并且在处理过程中发生错误,我如何将消息放入队列的末尾?
我正在尝试使用 nack 或拒绝,但消息总是重新放在第一个位置,其他消息保持冻结!
我不明白为什么必须将消息放在第一位,我正在尝试“玩”其他选项,例如 requeue 或 AllupTo,但它们似乎都不起作用。
先感谢您!
文档说:
消息可以使用具有 requeue 参数(basic.recover、basic.reject 和 basic.nack)的 AMQP 方法返回到队列,或者由于通道关闭而持有未确认的消息。对于 2.7.0 之前的 RabbitMQ 版本,任何这些情况都会导致消息在队列后面重新排队。从 RabbitMQ 2.7.0 版开始,消息始终按发布顺序保存在队列中,即使存在重新排队或通道关闭。
在 2.7.0 及更高版本中,如果队列有多个订阅者,单个消费者仍然可以观察到乱序的消息。这是由于可能重新排队消息的其他订阅者的行为造成的。从队列的角度来看,消息始终按发布顺序保存。
记住ack
您成功的消息,否则它们将不会从队列中删除。
如果您需要更多地控制被拒绝的邮件,您应该看看死信交换。
nack 或 reject 丢弃消息或重新排队消息。
对于您的要求,以下可能是合适的,
一旦消费者收到消息,就在开始处理它之前,将 ack() 发送回 rabbitmq 服务器。
然后处理消息,如果在过程中发现任何错误,则将相同的消息发送(发布)到同一个队列中。这会将消息放在队列的后面。
成功处理后什么也不做。ack() 已经发送到rabbitmq 服务器。只需接收下一条消息并进行处理。