我有一个活动队列,它将拥有来自Publisher的所有消息。我的消费者根据消息处理结果读取这些消息和Acks / Nack。
while (true)
{
var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
var processed = ProcessMessage(message)
if (processed)
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
else
channel.BasicNack(deliveryTag: ea.DeliveryTag, multiple: false, requeue: true);
}
我的问题是
true
参数正确无误,是否设置了requeue
?感谢您的投入
答案 0 :(得分:3)
从版本3.5.2开始,RabbitMQ会自动为包含以下信息的死信消息添加标题:
查看"Dead-Lettered Messages" section near the end of the DLX documentation了解更多详情。
如果您使用较旧版本的RabbitMQ,那么@ Franklin的解决方案应该可行。
答案 1 :(得分:1)
如果将requeue设置为false,则它将转到分配给Queue的任何DeadLetter Exchange。 True将重新排列该消息。
我为重试尝试所做的是创建一个保持交换和队列。如果要重试消息,请将正Ack返回到队列,向消息添加RetryAttepmts标头,然后使用超时值将其发布到HoldQueue Exchange。将Hold Queue Dead Letter Exchange设置为将消息发送到原始队列的交换机。然后检查标题并确认重试尝试是否太大
这是一个很好的网站,详细介绍了这个过程 http://yuserinterface.com/dev/2013/01/08/how-to-schedule-delay-messages-with-rabbitmq-using-a-dead-letter-exchange/