RabbitMQ 消息确认

AMQP协议:是一个金融级的消息队列,确保消息万无一失

1、消息发布端的确认

  手动确认消息是否已经发送

  场景:发布消息到RabbitMQ中,我们需要知道这个消息是否发布成功了。

  *发布确认影响性能  confirm机制对性能的影响 < tx机制对性能的影响

  1)、confirm机制

  

1             channel.ConfirmSelect();
2             channel.BasicPublish("headersExchange", string.Empty, properties, Encoding.UTF8.GetBytes("来自.net的问候"));
3             var isAllPublished = channel.WaitForConfirms();

  2)、tx机制

  

 1             try
 2             {
 3                 //发布消息
 4                 //String exchange,  交换机名称
 5                 //String routingKey,    routingKey
 6                 //IBasicProperties basicProperties,     发布属性
 7                 //Byte[] body   消息内容
 8                 channel.TxSelect();
 9                 channel.BasicPublish("headersExchange", string.Empty, properties, Encoding.UTF8.GetBytes("来自.net的问候"));
10                 channel.TxCommit();
11             }
12             catch (Exception)
13             {
14                 channel.TxRollback();
15             }

2、消息消费端的确认

  自动确认:消息出队列的时候就自动确认

  手动确认:消息出队列之后,要应用程序自己去确认是否已经消费完毕,如果消费端拿到消息之后没有手动确认,这个时候消息不会被丢失。

1             //直接获取消息
2             //String queue,     队列名称
3             //Boolean autoAck   是否自动确认(一般设置为true)
4             var result = channel.BasicGet("headersQueue", false);
5             //手动确认
6             //UInt64 deliveryTag, 
7             //Boolean multiple  结果是否为多条数据
8             channel.BasicAck(result.DeliveryTag, false);

  手动拒绝:消费端拒绝队列发送过来的消息

  

 1             //直接获取消息
 2             //String queue,     队列名称
 3             //Boolean autoAck   是否自动确认(一般设置为true)
 4             var result = channel.BasicGet("headersQueue", false);
 5             //手动确认
 6             //UInt64 deliveryTag, 
 7             //Boolean multiple  结果是否为多条数据
 8             channel.BasicAck(result.DeliveryTag, false);
 9             //手动拒绝(单个)
10             //UInt64 deliveryTag, 
11             //Boolean requeue   是否重新放回队列,true==是,false==丢弃
12             channel.BasicReject(result.DeliveryTag, true);
13             //手动拒绝(单或多均可)
14             //UInt64 deliveryTag, 
15             //Boolean multiple,     是否多条数据
16             //Boolean requeue   是否重新放回队列,true==是,false==丢弃
17             channel.BasicNack(result.DeliveryTag, false, true);

  重新递送【商家补发】:类似于快递丢单,商家只能重新发一次

 1             //直接获取消息
 2             //String queue,     队列名称
 3             //Boolean autoAck   是否自动确认(一般设置为true)
 4             var result = channel.BasicGet("headersQueue", false);
 5             //手动确认
 6             //UInt64 deliveryTag, 
 7             //Boolean multiple  结果是否为多条数据
 8             channel.BasicAck(result.DeliveryTag, false);
 9             //手动拒绝(单个)
10             //UInt64 deliveryTag, 
11             //Boolean requeue   是否重新放回队列,true==是,false==丢弃
12             channel.BasicReject(result.DeliveryTag, true);
13             //手动拒绝(单或多均可)
14             //UInt64 deliveryTag, 
15             //Boolean multiple,     是否多条数据
16             //Boolean requeue   是否重新放回队列,true==是,false==丢弃
17             channel.BasicNack(result.DeliveryTag, false, true);
18             //重新递送
19             //Boolean requeue   true==重新入队列,可能会被其他消费者所接收;false==重新给当前消费者递送
20             channel.BasicRecover(false);

消息中的Properties属性

  创建方式

  

1             //设置消息属性
2             var properties = channel.CreateBasicProperties();

  1.Persistent:Bool

  是否持久化

原文地址:https://www.cnblogs.com/fanqisoft/p/10392506.html