消息应答机制是一个很重要的功能,它能保证消息队列中的某个消息是否被成功处理。如果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(); } }