当前位置: 首页 > news >正文

RabbitMQ消息可靠性(二)-- 消费者消息确认

一、消费者消息确认是什么?

在这种机制下,消费者在接收到消息后,需要向 RabbitMQ 发送确认信息,告知 RabbitMQ 已经接收到该消息,并已经处理完毕。如果 RabbitMQ 没有接收到确认信息,则会将该消息重新加入队列,等待其他消费者继续处理。

消费者消息确认机制能够保证消息不会因为消费者宕机或其他原因而丢失,从而保证了消息的可靠性和稳定性。

RabbitMQ 支持两种消费者消息确认机制:自动确认和手动确认。在自动确认模式下,消费者在接收到消息后,RabbitMQ 会自动将该消息标记为已经确认。在手动确认模式下,消费者需要向 RabbitMQ 显式地发送确认信息,才能完成消息的确认。

二、代码实现

1.修改application.yml 配置

spring:rabbitmq:listener:simple:# RabbitMQ开启手动确认acknowledge-mode: manual

而SpringAMQP则允许配置三种确认模式:

  1. manual:手动ack,需要在业务代码结束后,调用api发送ack。
  2. auto:自动ack,由spring监测listener代码是否出现异常,没有异常则返回ack;抛出异常则返回nack
  3. none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除

2.消费者确认

生产者发送一笔需要消费的订单到Direct Exchange直连交换机

@GetMapping("/sendDirectMessage")@ApiOperation(value = "sendDirectMessage")@ApiOperationSupport(order = 1)public String sendDirectMessage(@RequestParam String orderNo){//设置消息唯一IDString uniqueId = "MQ"+ DateUtils.dateTimeNow("yyyyMMddHHmmss")+ RandomUtil.randomNumbers(4);CorrelationData correlationData = new CorrelationData(uniqueId);log.info("------生产者发送消息,消息唯一id {},订单编号 {}-------",uniqueId,orderNo);rabbitTemplate.convertAndSend("TestDirectExchange", "TestDirectRouting",orderNo,correlationData);return "ok";}

下面是消费者的处理逻辑
这里的消息序号是系统自动生成的,还需要注意的是,在手动确认模式下,如果消费者在处理消息时发生了异常或错误的时候

需要确保将该消息重新加入队列或者删除队列之后将该信息保存至数据库中记录下来,否则该消息将被认为已经成功处理并确认。因此,在编写消费者代码时,需要谨慎处理异常情况,避免因为异常而导致消息丢失或重复处理等问题。

/*** 消费者,用于消费队列信息*/
@Component
@Slf4j
public class DirectConsumer {@ResourceRedisService redisService;@RabbitListener(queues = "TestDirectQueue")//监听的队列名称 TestDirectQueuepublic void process(Message message, Channel channel) {// 消息序号long deliveryTag = message.getMessageProperties().getDeliveryTag();//取出消息唯一标识String messageId = message.getMessageProperties().getHeader("spring_returned_message_correlation");// 取出订单编码String orderNo = new String(message.getBody(), StandardCharsets.UTF_8);log.info("------消费者收到消息,消息唯一id {},订单编号 {}-------",messageId,orderNo);try {//消费者在消费消息之前,先去redis中查看消息状态是否已被消费if (redisService.setCacheMapIfAbsent("rabbit-tag", messageId, Boolean.FALSE)){//删除过期订单.......//消费完消息后,设置key的值为trueredisService.setCacheMapValue("rabbit-tag", messageId, Boolean.TRUE);channel.basicAck(deliveryTag,false);log.info("------订单处理完毕,订单编号 {}--------", orderNo);}else {//如果从redis中获取消息的value是TRUE,表示已消费,直接发送确认信号,避免重复消费if (Boolean.TRUE.equals(redisService.getCacheMapValue("rabbit-tag",messageId))) {/*** TODO 手动确认消息* tag:消息序号* multiple:消息的标识,是否确认多条,false只确认当前一个消息收到,true确认所有consumer获得的消息(成功消费,消息从队列中删除*/channel.basicAck(deliveryTag, false);log.info("--------订单已经被消费过了,订单编号 {}-------", orderNo);}}} catch (Exception e) {e.printStackTrace();try {/*** TODO 消费者消费消息异常,手动否认信息,将消息退回到队列中* tag:消息序号* multiple:消息的标识,是否确认多条,false只确认当前一个消息收到,true确认所有consumer获得的消息(成功消费,消息从队列中删除* requeue:是否要退回到队列*/channel.basicNack(deliveryTag, true, false);redisService.setCacheMapValue("rabbit-tag", messageId, Boolean.FALSE);log.error("------------订单消费失败,已从队列删除.订单编号 {}, 原因 {}--------",orderNo, e.getMessage());} catch (IOException ex) {ex.printStackTrace();}}log.info("------消费者处理完毕-------");}
}

相关文章:

RabbitMQ消息可靠性(二)-- 消费者消息确认

一、消费者消息确认是什么? 在这种机制下,消费者在接收到消息后,需要向 RabbitMQ 发送确认信息,告知 RabbitMQ 已经接收到该消息,并已经处理完毕。如果 RabbitMQ 没有接收到确认信息,则会将该消息重新加入…...

【python第7课 实例,类】

文章目录 一、实例1.1实例的变量1.2实例方法1.3 构造方法1.4析构函数1.4预置实例属性: 二,类1.1类变量1.2类方法1.3静态方法1.4类属性的增删改查 一、实例 1.1实例的变量 使用示例 class dog:def __init__(self,k,c,a):self.kinds kself.color csel…...

RocketMQ源码解析(上)

一、ACL权限控制 应用场景: ​RocketMQ提供了针对队列、用户等不同维度的非常全面的权限管理机制。通常来说,RocketMQ作为一个内部服务,是不需要进行权限控制的,但是,如果要通过RocketMQ进行跨部门甚至跨公司的合作&…...

Webpack打包CSS文件,解决You may need an appropriate loader to handle this file type报错

在项目文件夹下创建webpack.config.js文件,该文件就是Webpack的配置文件 注意:该文件中遵循Node.js的代码格式规范 ,需要对导出配置文件中的内容 Webpack在默认情况下只能打包js文件,如果我们希望他能够打包其他类型的文件&#…...

轮换对称性

二重积分 普通对称性–D关于 y x yx yx对称: ∬ D f ( x , y ) d σ { 2 ∬ D 1 f ( x , y ) d σ f ( x , y ) f ( y , x ) 0 f ( x , y ) − f ( y , x ) \iint_{D}f(x,y)d\sigma\begin{cases} 2\iint_{D_1}f(x,y)d\sigma\ \ \ \ \ \ f(x,y)f(y,x) \\ 0 \ \…...

【MySQL基础】--- 约束

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 目录 一、什么…...

ROS2 的行为树 — 第 1 部分:解锁高级机器人决策和控制

一、说明 在复杂而迷人的机器人世界中,行为树(BT)已成为决策过程中不可或缺的一部分。它们提供了一种结构化、模块化和高效的方法来对机器人的行为进行编程。BT起源于视频游戏行业,用于控制非玩家角色,他们在机器人领域…...

kafka事务的详解

一 kafka事务的机制 1.1 kafka的事务机制 通过事务机制,KAFKA 可以实现对多个 topic 的多个 partition 的原子性的写入,即处于同一个事务内的所有消息,不管最终需要落地到哪个 topic 的哪个 partition, 最终结果都是要么全部写成功&#xf…...

Flutter Fair逻辑动态化架构设计与实现

本文的核心内容包括: 数据逻辑处理布局中的逻辑处理Flutter类型数据处理一、数据逻辑处理 我们接触的每一个Flutter界面,大多由布局和逻辑相关的代码组成。如Flutter初始工程的Counting Demo的代码: class _MyHomePageState extends State<MyHomePage> {// 变量 int…...

【每日一题】74. 搜索二维矩阵

74. 搜索二维矩阵 - 力扣&#xff08;LeetCode&#xff09; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返…...

软件测试进大厂,拿高薪,怎么做?看这里!

有些同学大学专业不对口&#xff0c;但有想进大厂想拿高薪心&#xff0c;只要你有想法&#xff0c;那就一定有实现的方法。 俗话说&#xff1a;“世间无难事&#xff0c;只怕有心人”。仔细思索一下&#xff0c;哪家大厂能缺软件测试这一重要职位。相对大学所学专业而言&#…...

【读书笔记】基于世界500强的高薪实战Kubernetes课程

第1章 课程简介&&自我介绍 1-1 自我介绍 1-2 课程大纲内容介绍 1-3 课程更新通知 第2章 K8s必备知识-Docker容器基础入门 2-1 课程介绍 2-2 docker容器介绍 2-3 docker优缺点 2-4 安装和配置docker 2-5 修改内核参数 2-6 配置镜像加速器 2-7 配置常用镜像加…...

【Java 基础篇】Java并发包详解

多线程编程是Java开发中一个重要的方面&#xff0c;它能够提高程序的性能和响应能力。然而&#xff0c;多线程编程也伴随着一系列的挑战&#xff0c;如线程安全、死锁、性能问题等。为了解决这些问题&#xff0c;Java提供了一套强大的并发包。本文将详细介绍Java并发包的各个组…...

MYSQL存储引擎基础知识介绍

下面重点介绍几种常用的存储引擎,并对比各个存储引擎之间的区别&#xff0c;以帮助读者理解 不同存储引擎的使用方式。 MyISAM MyISAM是 MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键&#xff0c;其优势是访 问的速度快&#xff0c;对事务完整性没有要求或者以 SEL…...

vue学习之element-ui组件集成

1. element-ui 链接 https://element.eleme.cn/#/zh-CN 2. element-ui 安装 cnpm install element-ui3. 创建项目 https://blog.csdn.net/qq_36940806/article/details/132921688?spm=1001.2014.3001.5502 4. 引入element库 /src/main.js 引入 element-uiimport Vue from…...

如何通过百度SEO优化提升网站排名(掌握基础概念,实现有效优化)

随着互联网的发展&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;成为了网站优化中不可或缺的一部分。在中国&#xff0c;百度搜索引擎占据着主导地位&#xff0c;因此掌握百度SEO概念和优化技巧对网站的排名和曝光非常重要。 百度SEO排名的6个有效方法&#xff1a; 首…...

Golang 字符串

目录 1. Golang 字符串1.1. 基础概念1.2. 字符串编码1.3. 遍历字符串1.4. 类型转换1.5. 总结1.6. String Concatenation (字符串连接)1.6.1. Using the operator1.6.2. Using the operator1.6.3. Using the Join method1.6.4. Using Sprintf method1.6.5. Using Go string Bu…...

python应用中使用了multiprocessing多进程,使用pyinstaller打包出来的程序可能产生多个窗口

问题现象 我用pyside&#xff08;类似pyqt&#xff09;开发了一个应用程序。直接使用pycharm运行&#xff0c;一切都正常。但当我使用pyinstaller将它打包之后&#xff0c;再去运运行&#xff0c;发现窗口总是产生多个。 问题分析 直接运行没有问题&#xff0c;那么问题肯定…...

数据结构与算法——13.队列的拓展

这篇文章主要讲一下双端队列&#xff0c;优先队列&#xff0c;阻塞队列等队列的拓展内容。 目录 1.队列拓展概述 2.双端队列的链表实现 3.双端队列的数组实现 4.优先队列无序数组实现 5.阻塞队列 6.总结 1.队列拓展概述 首先来看一张图&#xff0c;来大致了解一下他们的…...

机器学习入门教学——损失函数(交叉熵法)

1、前言 我们在训练神经网络时&#xff0c;最常用到的方法就是梯度下降法。在了解梯度下降法前&#xff0c;我们需要了解什么是损失(代价)函数。所谓求的梯度&#xff0c;就是损失函数的梯度。如果不知道什么是梯度下降的&#xff0c;可以看一下这篇文章&#xff1a;机器学习入…...

告别ZooKeeper!ClickHouse Keeper双机集群搭建全攻略(含常见报错解决方案)

ClickHouse Keeper双机集群实战指南&#xff1a;从零搭建到故障排查 1. 为什么选择ClickHouse Keeper替代ZooKeeper 在ClickHouse集群架构中&#xff0c;协调服务一直扮演着关键角色。传统方案依赖ZooKeeper实现分布式协调&#xff0c;但这种方式存在几个明显痛点&#xff1a; …...

3步释放华硕笔记本潜能:G-Helper轻量化控制工具的极致优化指南

3步释放华硕笔记本潜能&#xff1a;G-Helper轻量化控制工具的极致优化指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models …...

2026年上海网站建设市场分析:企业官网从展示到增长的演进路径

2026年&#xff0c;上海企业数字化服务市场迎来结构性变革。据2026年上半年上海企业数字化服务市场调研数据显示&#xff0c;上海地区企业官网新建与升级需求同比增长45%&#xff0c;中大型企业对官网的核心诉求已从基础信息展示转向AI智能赋能、全球化跨境适配、全链路营销转化…...

OpenClaw语音控制扩展:Qwen3.5-4B-Claude对接Whisper实现声控自动化

OpenClaw语音控制扩展&#xff1a;Qwen3.5-4B-Claude对接Whisper实现声控自动化 1. 为什么需要语音控制自动化 去年冬天的一个深夜&#xff0c;我在赶制项目文档时突发奇想&#xff1a;如果能让AI听懂我的语音指令直接操作电脑&#xff0c;是不是连键盘都不用碰了&#xff1f…...

告别蓝牙!用STM32F103和NRF24L01搭建低成本2.4G无线通信,实测传输距离与稳定性

STM32F103与NRF24L01构建高性能2.4G私有通信系统实战指南 在物联网设备爆发式增长的今天&#xff0c;无线通信模块的选择成为硬件开发者面临的首要难题。面对市面上琳琅满目的蓝牙、Wi-Fi和私有协议模块&#xff0c;如何根据项目需求选择最具性价比的解决方案&#xff1f;本文将…...

OpenRocket:开源火箭仿真平台的技术架构与实践指南

OpenRocket&#xff1a;开源火箭仿真平台的技术架构与实践指南 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 价值定位&#xff1a;如何突破传统火箭设计…...

告别枯燥刷怪!用Python+大漠插件实现《功夫》游戏后台自动挂机(附完整源码)

用Python与大漠插件打造《功夫》游戏智能挂机系统 在角色扮演类游戏中&#xff0c;重复性的任务往往成为玩家体验的瓶颈。以经典游戏《功夫》为例&#xff0c;"考古"任务需要不断接取、放弃任务直至找到特定地点&#xff0c;再完成打怪流程。这种机械操作不仅耗时耗力…...

燃油车虎视眈眈,电车涨价的图谋必将落空,油价上涨的利好将消失

近期以来多家电车企业涨价&#xff0c;美国电车涨价尤为明显&#xff0c;最高涨幅2万元&#xff0c;而国产电车涨价3000-1.4万元不等&#xff0c;凸显出电车似乎突然间对市场乐观起来&#xff0c;导致他们信心十足的在于3月份以来的油价上涨&#xff0c;但是这种涨价将迅速导致…...

CTFHub | 解密MySQL、Redis、MongoDB流量中的隐藏Flag

1. 数据库流量分析入门&#xff1a;为什么需要Wireshark&#xff1f; 当你参加CTF比赛时&#xff0c;经常会遇到需要从数据库流量中寻找Flag的题目。这类题目通常会给你一个抓包文件&#xff08;pcap格式&#xff09;&#xff0c;里面记录了MySQL、Redis或MongoDB等数据库的网络…...

Scarab:空洞骑士模组管理效率提升83%的智能工具

Scarab&#xff1a;空洞骑士模组管理效率提升83%的智能工具 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 如何解决模组管理难题&#xff1f;3大创新让你告别手动配置烦恼 对…...