gpt4 book ai didi

c# - Rabbitmq Ack 或 Nack,将消息留在队列中

转载 作者:太空狗 更新时间:2023-10-29 20:56:25 27 4
gpt4 key购买 nike

我一直在研究 RabbitMq.net 和消息确认。如果消费者能够处理消息,您可以以

的形式发回确认
channel.BasicAck(ea.DeliveryTag, false);

这会将其从队列中移除。

但是如果消息无法处理怎么办?也许是临时中断,您不希望从队列中取出的消息只是放在后面继续处理下一条消息?

我试过用

channel.BasicNack(ea.DeliveryTag, false, true);

但下一轮它仍然收到相同的消息,而不是移动到队列中的下一条消息

我的完整代码是

class Program
{
private static IModel channel;
private static QueueingBasicConsumer consumer;
private static IConnection Connection;

static void Main(string[] args)
{
Connection = GetRabbitMqConnection();
channel = Connection.CreateModel();
channel.BasicQos(0, 1, false);
consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume("SMSQueue", false, consumer);
while (true)
{
if (!channel.IsOpen)
{
throw new Exception("Channel is closed");
}
var ea = consumer.Queue.Dequeue();
string jsonified = Encoding.UTF8.GetString(ea.Body);
var message = JsonConvert.DeserializeObject<SmsRecords>(jsonified);
if (ProcessMessage())
channel.BasicAck(ea.DeliveryTag, false);
else
channel.BasicNack(ea.DeliveryTag, false, true);
}
}

private static bool ProcessMessage()
{
return false;
}

public static IConnection GetRabbitMqConnection()
{
try
{
var connectionFactory = new ConnectionFactory
{
UserName = "guest",
Password = "guest",
HostName = "localhost"
};
return connectionFactory.CreateConnection();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
}

最佳答案

我的公司是这样做的:如果一条消息失败(出于任何原因),我们会将消息放入一个保持队列中并等待 10 秒钟,然后将其放回队列中以进行重试。我们最多执行此循环 10 次,如果消息被 nacked 10 次,那么我们认为这是一个我们无法恢复的故障,我们将其放入永久死信队列以进行调查。

这是示意图: enter image description here

关于c# - Rabbitmq Ack 或 Nack,将消息留在队列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28604332/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com