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("------消费者处理完毕-------");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/84412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在visual studio里安装Python并创建python工程

在2009年,云计算开始发力,Python、R、Go这些天然处理批量计算的语言也迅猛发展。微软在2010年,把Python当成一个语言包插件,集成到了visual studio 2010里。在"云优先,移动优先"的战略下,于2015年…

如何在 Excel 中进行加,减,乘,除

在本教程中,我们将执行基本的算术运算,即加法,减法,除法和乘法。 下表显示了我们将使用的数据以及预期的结果。 | **S / N** | **算术运算符** | **第一个号码** | **第二个号码** | **结果** | | 1 | 加法(&#xff…

【Redis】深入探索 Redis 的哨兵(Sentinel)机制原理,基于 Docker 模拟搭建 Redis 主从结构和哨兵分布式架构

文章目录 一、对 Redis Sentinel 的认识1.1 什么是 Redis Sentinel1.2 为什么要使用 Redis Sentinel1.2.1 主从复制问题1.2.2 人工恢复主节点故障 二、Redis Sentinel 原理剖析2.1 Redis Sentinel 架构2.2 Raft 算法和领袖节点2.3 哨兵节点2.4 故障检测2.5 故障切换2.6 监控和通…

MybatisMybatisPlus 操作 jsonb 格式数据

最近有用到postgresql&#xff0c;里面的一个特色数据类型便是jsonb&#xff0c;和json差不多&#xff0c;但是查询比较快&#xff0c;关于概念&#xff0c;这里就提一句&#xff0c;不赘述。 我们先来看下用mybatisplus&#xff0c;首先是查询数据。 依赖&#xff1a; <d…

【MySQL】 MySQL的增删改查(进阶)--壹

文章目录 &#x1f6eb;数据库约束&#x1f334;约束类型&#x1f38b;NOT NULL约束&#x1f38d;UNIQUE&#xff1a;唯一约束&#x1f333;DEFAULT&#xff1a;默认值约束&#x1f384;PRIMARY KEY&#xff1a;主键约束&#x1f340;FOREIGN KEY&#xff1a;外键约束&#x1f…

8.idea 使用 docker 构建 java web 项目

docker 构建 java web 项目 和 docker 构建 spring boot 项目&#xff0c;除了 Dockerfile 不同&#xff0c;其他是都一样的。其他步骤参考&#xff1a;idea 使用 docker 构建 spring boot 项目&#xff0c;构建 Java Web 项目的 Dockerfile示例如下&#xff1a; 因为 java web…

idea中提示:error has occurred, please check your installation and try again

目录 报错原因解决总结 报错 idea中提示&#xff1a;error has occurred, please check your installation and try again 原因 1.起初我是把一个运行正常的java程序&#xff0c;放到了src下&#xff0c;新建的一个包&#xff08;包名为java.first&#xff09;中&#xff0c…

NLP文本生成全解析:从传统方法到预训练完整介绍

目录 1. 引言1.1 文本生成的定义和作用1.2 自然语言处理技术在文本生成领域的使用 2 传统方法 - 基于统计的方法2.1.1 N-gram模型2.1.2 平滑技术 3. 传统方法 - 基于模板的生成3.1 定义与特点3.2 动态模板 4. 神经网络方法 - 长短时记忆网络(LSTM)LSTM的核心概念PyTorch中的LST…

动力节点老杜JavaWeb笔记(全)

Servlet 关于系统架构 系统架构包括什么形式&#xff1f; C/S架构B/S架构 C/S架构&#xff1f; Client / Server&#xff08;客户端 / 服务器&#xff09;C/S架构的软件或者说系统有哪些呢&#xff1f; QQ&#xff08;先去腾讯官网下载一个QQ软件&#xff0c;几十MB&#xff…

ChatGLM LoRA微调定制AI大模型

一、前言 对于 ChatGLM2-6B 模型基于 PEFT 的特定任务微调实验。 1.1 硬件需求 注:r 为LoRA 维数大小,p 为前缀词表大小,l 为微调层数,ex/s 为每秒训练的样本数。gradient_accumulation_steps 参数设置为 1。上述结果均来自于单个 Tesla V100 GPU,仅供参考。 1.2 微调方…

反射获取类及其父类的所有字段

getFields返回一个Field类型数组&#xff0c;其中包含当前类的public字段&#xff0c;如果此类继承于某个父类&#xff0c;同时包括父类的public字段。其它的proteced和private字段&#xff0c;无论是属于当前类还是父类都不被此方法获取。 getDeclareFields返回一个Field类型…

vector使用和模拟实现

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; C&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大…

记一次clickhouse手动更改分片数异常

背景&#xff1a;clickhouse中之前是1分片1副本&#xff0c;随着数据量增多&#xff0c;想将分片数增多&#xff0c;于是驻场人员手动添加了分片数的节点信息 <clickhouse><!-- 集群配置 --><clickhouse_remote_servers><feihuang_ck_cluster><sha…

新增MariaDB数据库管理、支持多版本MySQL数据库共存,1Panel开源面板v1.6.0发布

2023年9月18日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.6.0版本。 在这个版本中&#xff0c;1Panel新增MariaDB数据库管理&#xff1b;支持多版本MySQL数据库共存&#xff1b;支持定时备份系统快照和应用商店中已安装应用&#xff1b;支持为防火墙…

人脸识别三部曲

人脸识别三部曲 首先看目录结构图像信息采集 采集图片.py模型训练 训练模型.py人脸识别 人脸识别.py效果 首先看目录结构 引用文121本 opencv │ 采集图片.py │ 训练模型.py │ 人脸识别.py │ └───trainer │ │ trainer.yml │ └───data │ └──…

Laravel一些优雅的写法

1. 新增操作 // 原则&#xff0c;所有服务类只有一个public入口,或者多个public入口&#xff0c;但是他们做都是同一件事情 Class CreateService {// 创建类的入口, 根据dto去新建public function create(Dto $dto){// 先构建model对象, 不要在事务期间构建&#xff0c;减少事务…

关于时空数据的培训 GAN:实用指南(第 02/3 部分)

一、说明 在本系列关于训练 GAN 实用指南的第 1 部分中&#xff0c;我们讨论了 a&#xff09; 鉴别器 &#xff08;D&#xff09; 和生成器 &#xff08;G&#xff09; 训练之间的不平衡如何导致模式崩溃和由于梯度消失而导致静音学习&#xff0c;以及 b&#xff09; GAN 对超参…

3D模型转换工具HOOPS Exchange如何实现OBJ格式轻量化?

什么是OBJ模型轻量化&#xff1f; OBJ格式是一种常用的三维模型文件格式&#xff0c;通常包含模型的顶点、法线、纹理坐标等信息&#xff0c;但有时候这些信息可能会使模型文件变得较大&#xff0c;不利于网络传输、加载和运行。 OBJ&#xff08;Object&#xff09;模型轻量化…

工厂模式-(简单工厂模式)

首先看一下设计模式的六大原则 设计模式的六大原则 1、开闭原则&#xff08;Open Close Principle&#xff09; 开闭原则就是说对扩展开放&#xff0c;对修改关闭。在程序需要进行拓展的时候&#xff0c;不能去修改原有的代码&#xff0c;实现一个热插拔的效果。所以一句话概…

arthas诊断windows服务模式运行的Java进程

arthas诊断windows服务模式运行的Java进程 arthas线上debug非常好用&#xff0c;但是有些场景不能直接使用。如何使用arthas请自行查看官网文档&#xff0c;本文不再赘述&#xff01; 1.windows服务运行jar包场景 有些情况&#xff0c;我们java项目以windows服务的形式运行在…