RabbitMQ 消息应答机制(message acknowledgments)

消息应答机制是一个很重要的功能,它能保证消息队列中的某个消息是否被成功处理。如果RabbitMQ server收到Consumer端发来的应答信号,就会将Consumer刚才处理的消息删除,并发送下一个消息给Consumer去处理;如果Consumer端没有回发确认消息给RabbitMQ server,那么当前消息就一直存在消息队列中,如果Consumer端的连接断掉了,RabbitMQ server就会将该消息发送给另外的Consumer去处理。

因此可以看出,消息应答机制是针对Consumer来说的。

设置在Consumer端设置消息应答很简单,共有2步:

1、设置Consumer时,指定当前的Consumer为消息应答方式;

2、Consumer在处理完当前消息后,回发一个确认消息给RabbitMQ server即可。

话不多说,上代码!

using (var connection = factory.CreateConnection()) {
                using (var channel = connection.CreateModel()) {
                    channel.QueueDeclare(queue: "q.log.info",
                                         durable: false,
                                         exclusive: false,
                                         autoDelete: false,
                                         arguments: null);

                    channel.BasicQos(0, 1, false);

                    var consumer = new EventingBasicConsumer(channel);

                    consumer.Received += (model, ea) => {
                        var body = ea.Body;
                        var message = Encoding.UTF8.GetString(body);
                        Console.WriteLine("{0}", message);
                        //处理完消息后,回发一个确认消息给RabbitMQ server,说明当前消息已被成功处理
                        channel.BasicAck(ea.DeliveryTag, false);
                    };
                    channel.BasicConsume(queue: "q.log.info",
                                         noAck: false,//将消息应答功能开启  true:不开消息应答功能  false:开启消息应答功能
                                         consumer: consumer);
                   
                    Console.ReadLine();
                }
            }