我正在处理能够处理来自RabbitMQ的消息的工作者。
但是,我不确定如何做到这一点。
如果我收到一条消息,并且在我处理过程中发生错误,我该如何将消息放入队列的末尾?
我试图使用nack或拒绝,但邮件总是重新放在第一个位置,其他邮件保持冻结状态!
我不明白为什么要把信息放在第一个位置,我试图"玩"与requeue或AllupTo等其他选项一样,但它们似乎都不起作用。
提前谢谢!
答案 0 :(得分:1)
可以使用具有重新排列参数的AMQP方法将消息返回到队列(basic.recover,basic.reject和 basic.nack),或由于在保持未确认的情况下关闭频道 消息。任何这些情况都会导致消息被重新排队 早于2.7.0的RabbitMQ版本的队列后面。从 RabbitMQ发布2.7.0,消息总是保存在队列中 出版顺序,即使存在重新排队或频道 闭合。
对于2.7.0及更高版本,个人仍然可以使用 消费者如果队列有多个,则不按顺序观察消息 订户。这是由于其他订户的行为可能 重新排队消息。从队列的角度来看,消息是 始终保持在出版顺序中。
请记住ack
成功的消息,否则不会将其从队列中删除。
如果您需要更多地控制被拒绝的邮件,请查看dead letter exchanges。
答案 1 :(得分:0)
nack或拒绝丢弃邮件或重新排队邮件。
对于您的要求可能适合,
消费者收到消息后,在开始处理消息之前,将ack()发送回rabbitmq服务器。
然后处理消息,如果在该过程中发现任何错误,则将相同的消息发送(发布)到同一队列中。这会将消息放在队列的后面。
成功处理后什么都不做。 ack()已经发送到rabbitmq服务器。只需接收下一条消息并进行处理即可。