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

版权:本作品采用「本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。」许可协议进行许可。

posted @   SpringCore  阅读(693)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示