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

lev*_*bra 6 .net c# message-queue rabbitmq

我一直在玩RabbitMq.net和消息致谢.如果消费者能够处理消息,您可以以形式发回一个确认

channel.BasicAck(ea.DeliveryTag, false);
Run Code Online (Sandbox Code Playgroud)

这将把它从队列中删除.

但是,如果邮件无法处理呢?也许是暂时的中断,你不希望从队列中取出的消息只是放在后面并继续下一条消息?

我试过用

channel.BasicNack(ea.DeliveryTag, false, true);
Run Code Online (Sandbox Code Playgroud)

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

我的完整代码是

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

jhi*_*den 15

这就是我的公司如何做到这一点:如果一条消息失败(出于任何原因),我们将消息放入一个保持队列中,它会停留10秒钟,然后将其重新放回队列中进行重试.我们这个循环最多循环10次,如果消息被忽略了10次,那么我们认为它是一个我们无法恢复的故障,我们把它放入一个永久的死信队列进行调查.

这是图表: 在此输入图像描述

  • 如何将消息“放入保留队列”?它不会自动重新排队到原始队列中吗? (6认同)