背景
我的队列中有两条消息:
我有一个频道,一个Qos处于活跃状态且预取计数为1的消费者。
方案
邮件传递foo
进来,我拒绝了requeue=true
邮件。
预期:
下一封邮件是bar
实际值:
下一封邮件是foo
问题:
为什么我的消费者会收到刚刚重新排队的消息而不是下一封消息呢?我怎样才能得到上述结果?
我希望重新排队的消息位于队列的尾部。
我已经考虑过确认并重新发布该消息,但这会导致丢失消息的风险。
答案 0 :(得分:4)
来自https://www.rabbitmq.com/semantics.html
可以使用具有a的AMQP方法将消息返回到队列 requeue参数(basic.recover,basic.reject和basic.nack),或者由于>一个频道在收到未确认的消息时关闭。任何这些 场景导致消息在队列后面重新排队 RabbitMQ早于2.7.0发布。来自RabbitMQ 2.7.0版, 消息始终以发布顺序保存在队列中,即使在 存在重新排队或通道关闭。
强调我的
因为您只有一个消费者,所以这种行为是预期的
您可以将邮件重新发布到同一个队列, 这将确保问题消息最终落在尾部。
您的另一个选择是为失败的消息创建新队列,这样您就可以 单独处理它们。