RabbitMQ-消息消费确认

devtools/2025/1/18 1:39:44/

我们一般使用的是消费者作为被动方接收 RabbitMQ 推送消息,另一种是消费者作为主动方可以主动拉取消息。

RabbitMq 服务器推送消息分为隐式(自动)确认和显示确认。

1 消费者拉取消息

消费者作为主动方拉取消息,每次只能获取一条。

using (var channel = connection.CreateModel())
{BasicGetResult result = channel.BasicGet("PersistenceQueue", true);string message = Encoding.UTF8.GetString(result.Body.ToArray());Console.WriteLine($"拉取到消息:{message}");
}

rabbitmq服务器推送消息">2 RabbitMq服务器推送消息

消费者作为被动方接收RabbitMQ推送消息。

using (var channel = connection.CreateModel())
{EventingBasicConsumer consumer = new EventingBasicConsumer(channel);//就是Rabbitmq的服务器作为主动方---RabbitMq 推送消息到消费者来的;consumer.Received += (model, ea) =>{string message = Encoding.UTF8.GetString(ea.Body.ToArray());Console.WriteLine($"正常收到消息:{message}");};channel.BasicConsume(queue: "PersistenceQueue", autoAck: true, consumer: consumer);
}

3 隐式确认

当 RabbbitMQ 将消息发送给消费者后,消费者端接收到消息后,不等待消息处理结束,立即自动回送一个确认回执。

自动确认的用法十分简单,设置消费方法的参数 autoAck 为 true 即可,我们前边的例子都是使用的自动确认。

channel.BasicConsume(queue: "PersistenceQueue", autoAck: true, consumer: consumer);

4 显式确认

设置消费方法的参数 autoAck 为 false,channel.BasicAck可以一条一条确认后删除,也可使用 channel.BasicReject不删除。

//定义消费者                                      
EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
int i = 0;
//就是Rabbitmq的服务器作为主动方---RabbitMq 推送消息到消费者来的;
consumer.Received += (model, ea) =>
{string message = Encoding.UTF8.GetString(ea.Body.ToArray());Console.WriteLine($"正常收到消息:{message}");if (i < 100){Console.WriteLine($"【{message}】消息已经被消费,同时从RabbitMQ服务器删除");channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);}else{Console.WriteLine($"【{message}】消息没有被正常消费,可以让消息不要删除");channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: true);//throw new Exception("消息消费异常了~");}i++;
};
//显式确认
channel.BasicConsume(queue: "PersistenceQueue", autoAck: false, consumer: consumer);

5 消息质量

channel.BasicQos可以设置每次从队列中取出几条消息进行消费。

channel.BasicQos(prefetchSize: 0, prefetchCount: 2, global: false);

方法中参数 prefetchSize 为预取的长度,一般设置为0即可,表示长度不限;

prefetchCount 表示预取的条数,即发送的最大消息条数;

global 表示是否在 Connection 中全局设置,true表示 Connetion 下的所有 channel 都设置为这个配置。


http://www.ppmy.cn/devtools/151424.html

相关文章

如何在uniapp中实现一个表格组件?

功能介绍&#xff1a; 1 表格头自定义列。 2 表格头支持勾选功能&#xff0c;并且支持配置。通过配置显示或隐藏该功能 3 支持自定义样式和自定义操作。比如修改列数据内容样式&#xff0c;上图中年龄做了自定义的处理&#xff0c;点击某列内容可以自定义操作。 ----------…

vue2配置跨域后请求的是本机

这个我来说明一下&#xff0c;因为我们公司的后端设置解决了跨域问题&#xff0c;所以我有很久没有看相关的内容了&#xff0c;然后昨天请求了需要跨域的接口&#xff0c;请求半天一直不对&#xff0c;浏览器显示的是本机地址&#xff0c;我以为是自己配置错了&#xff0c;后面…

HTTP 安全:HTTPS 原理与配置

一、引言 在当今数字化时代&#xff0c;网络安全至关重要。我们日常上网离不开 HTTP 协议&#xff0c;但它存在安全隐患。HTTP 以明文传输数据&#xff0c;信息易被窃取、篡改&#xff0c;身份也难以验证&#xff0c;像账号密码、交易信息等敏感内容在传输时毫无保障。 为解决…

Rust:指针 `*T` 和引用 `T`的区别

在 Rust 编程语言中&#xff0c;*T 和 &T 是两种不同类型的指针&#xff0c;它们各自代表了不同的内存访问方式和所有权模型。 *T&#xff08;原始指针或裸指针&#xff09;&#xff1a; *T 是一个原始指针&#xff08;也称为裸指针或裸引用&#xff09;&#xff0c;它可以…

从 Web3 到元宇宙:探索数字身份的奇幻演变

在数字时代的浪潮中&#xff0c;我们已经从传统的互联网走向了更为复杂和创新的Web3时代。随着技术的不断发展&#xff0c;数字身份作为这一变革的重要组成部分&#xff0c;正在经历一场前所未有的演变。这场变革不仅仅是技术的进步&#xff0c;更是对个人在虚拟世界中存在方式…

软件测试 —— Selenium(窗口)

软件测试 —— Selenium&#xff08;窗口&#xff09; 多个窗口打开情况current_window_handle、window_handles和switch_to.window示例代码注意事项 窗口大小的设置窗口最大化 maximize_window()窗口最小化 minimize_window()指定窗口全屏 fullscreen_window()手动设置窗口大小…

【Web系列三十】MYSQL库表比对升级

写在前面 随着软件的迭代开发&#xff0c;数据库表有变动是常有的事&#xff0c;如果没有在开发时记录变更情况的话。对于线上生产环境下的MYSQL库表升级就会比较麻烦。 因此本文主要提供了一个脚本&#xff0c;方便比对新旧数据库的sql文件&#xff0c;从而自动生成用户升级的…

计算机组成原理--笔记一

目录 一.计算机硬件的基本组成 1.早期冯诺依曼机的结构 2.现代计算机的结构 二.各个硬件的工作原理 1.主存储器 i. 读取数据 ii. 写入数据 1.1 基本组成 2.运算器 3.控制器 一.计算机硬件的基本组成 1.早期冯诺依曼机的结构 “存储程序”&#xff0c;将指令以二进制的形式输入…