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

RabbitMQ 确认机制

Sping AMQP 三种确认机制

NONE:自动确认,当队列将消息发送给消费者之后,不管消费者消费成功与否,都会自动确认该消息并将该消息移除
MANUAL:手动确认,需要消费者发送 ack(肯定确认,说明消息成功被消费掉) 或者 nack(否定确认,表示消息没有成功被消费掉)
AUTO:默认模式,当我们不进行设置的时候,Spring 会默认 rabbitmq 的确认机制为 NONE,当消费者在消息处理成功之后会自动确认消息,如果处理过程抛出了异常,则不会确认消息

SpringBoot 对应的配置信息:

spring:rabbitmq:listener:simple:acknowledge-mode: manual  # 设置确认模式

通过 acknowledge-mode 这个参数设置确认机制的模式

前期准备

队列名称:

public class MQConstants {//确认机制public static final String AXK_QUEUE = "ACK_QUEUE";}

队列声明:

@Configuration
public class MQConfig {//声明队列@Bean("ackQueue")public Queue ackQueue() {return QueueBuilder.durable(MQConstants.AXK_QUEUE).build();}}

生产者:

@RequestMapping("/proc")
@RestController
public class ProducerController {@Autowiredprivate RabbitTemplate rabbitTemplate;@RequestMapping("/ack")public String ack() {for (int i = 0; i < 10; i++) {rabbitTemplate.convertAndSend("", MQConstants.AXK_QUEUE, "ack: " + i);}return "消息发送成功";}}

NONE(自动确认)

消费者:

@Component
@RabbitListener(queues = MQConstants.AXK_QUEUE)
public class ACKListener {@RabbitHandlerpublic void handle(String messageContent, Channel channel, Message message) throws IOException {long deliveryTag = message.getMessageProperties().getDeliveryTag();System.out.println("接收到的消息为:" + messageContent);int n = 3 / 0;}
}

这里的消费者我们设置了一个算术异常,并且没有进行 catch,便于我们观察


开启 NONE 模式

        acknowledge-mode: none  # 设置确认模式

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
从上面的信息可以看出,即使我们的消费者消费消息失败,由于我们采用自动确认机制,因此我们的队列消息全部被消费掉了

并且在自动确认模式下,我们不需要通过 channel 发送 ack 或者 nack ,这部分确认代码可以省略

AUTO (默认确认)

设置为 AUTO 模式

        acknowledge-mode: auto  # 设置确认模式
@Component
@RabbitListener(queues = MQConstants.AXK_QUEUE)
public class ACKListener {@RabbitHandlerpublic void handle(String messageContent, Channel channel, Message message) throws IOException {long deliveryTag = message.getMessageProperties().getDeliveryTag();System.out.println("接收到的消息为:" + messageContent);int n = 3 / 0;}
}

启动程序的时候会发生一直死循环消费消息,因为在 AUTO 模式下,如果我们的消息没有设置如果消费失败或者消费中抛出异常的处理方法,这里是默认将失败的消息重新放入队列中的,我们可以看到 这 10 条消息都没有被确认

在这里插入图片描述

MANUAL (手动确认)

设置手动确认:

        acknowledge-mode: manual  # 设置确认模式

确认消息的方法有三种:这些方法通过 channel 进行调用

  1. basicAck: deliveryTag 消息的唯一标识,multiple (true 表示批量确认,false 表示不进行批量确认)
    批量确认介绍:当确认 序列号为deliveryTag 的消息的时候,小于 deliveryTag 的消息也会被一同确认掉
    在这里插入图片描述

  2. basicNack: requeue 表示是否重新入队,也就是说消费失败的消息要不要重新入队,true 表示重新入队,false 表示不重新入队

在这里插入图片描述

  1. basicReject 这个方法不能设置批量否定确认
    在这里插入图片描述

消费者:

@Component
@RabbitListener(queues = MQConstants.AXK_QUEUE)
public class ACKListener {@RabbitHandlerpublic void handle(String messageContent, Channel channel, Message message) throws IOException {long deliveryTag = message.getMessageProperties().getDeliveryTag();try {System.out.println("接收到的消息为:" + messageContent);int n = 3 / 0;channel.basicAck(deliveryTag, false);} catch (Exception e) {channel.basicNack(deliveryTag, false, false);}}
}

由于我们捕获到异常之后设置 requeue 为 false (不重新入队),所以我们不会重复消费,队列现在也为空,如果我们设置 true(重新入队),我们会在控制台看到消费者不断进行消费。

@Component
@RabbitListener(queues = MQConstants.AXK_QUEUE)
public class ACKListener {@RabbitHandlerpublic void handle(String messageContent, Channel channel, Message message) throws IOException {long deliveryTag = message.getMessageProperties().getDeliveryTag();try {System.out.println("接收到的消息为:" + messageContent);int n = 3 / 0;channel.basicAck(deliveryTag, false);} catch (IOException e) {channel.basicNack(deliveryTag, false, false);}}
}

如果我们没有捕获到异常:
在这里插入图片描述

停掉程序之后,我们依旧能看到消息还在队列中,也就是说如果消息没有被确认(肯定/否定确认)的话,消息是不会从队列中删除的。
在这里插入图片描述


文章转载自:

http://NWXACZZf.zmknt.cn
http://G31xOGC4.zmknt.cn
http://0cQa9GHH.zmknt.cn
http://uboe4jB1.zmknt.cn
http://aYFGDLLa.zmknt.cn
http://pOSH6VtA.zmknt.cn
http://oLVPY4iV.zmknt.cn
http://YSLRXqsq.zmknt.cn
http://R87S9EqU.zmknt.cn
http://cYNNDWQ7.zmknt.cn
http://Y2tvJNWU.zmknt.cn
http://iz0Lse64.zmknt.cn
http://wWBf8BTO.zmknt.cn
http://WaewYlC4.zmknt.cn
http://IaCLRwjh.zmknt.cn
http://kq8oJ54K.zmknt.cn
http://nmDMZO1j.zmknt.cn
http://hxirElyN.zmknt.cn
http://uLMQrE0W.zmknt.cn
http://FZmKlJ4C.zmknt.cn
http://X5CQAudc.zmknt.cn
http://HuExvYtk.zmknt.cn
http://BTytFdGV.zmknt.cn
http://RRblmjq9.zmknt.cn
http://LuoexyTo.zmknt.cn
http://6QjG0Yfc.zmknt.cn
http://FjNgktYc.zmknt.cn
http://I84CD8yx.zmknt.cn
http://rjglGwaM.zmknt.cn
http://AqfeV9PH.zmknt.cn
http://www.dtcms.com/a/371790.html

相关文章:

  • DrissionPage 优化天猫店铺商品爬虫:现代化网页抓取技术详解
  • 腾讯云服务器 监控系统 如何查看服务器的并发数量?
  • Qt---对话框QDialog
  • 5G NR-NTN协议学习系列:NR-NTN介绍(1)
  • 9.7需求
  • 43. 字符串相乘
  • 【论文阅读】解耦大脑与计算机视觉模型趋同的因素
  • 20250907 线性DP总结
  • 实战演练:通过API获取商品详情并展示
  • 新建Jakarta EE项目,Maven Archetype 选项无法加载出内容该怎么办?
  • 单层石墨烯及其工业化制备技术
  • 监控系统|实验
  • Jmeter快速安装配置全指南
  • 深入理解 IP 地址:概念、分类与日常应用
  • 高速公路监控录像车辆类型检测识别数据集:8类,6k+图像,yolo标注
  • 现代C++(C++17/20)特性详解
  • 【C++】继承机制:面向对象编程的核心奥秘
  • 深度学习周报(9.1~9.7)
  • Spring 日志文件
  • 【HARP 第二期】HARP 的数据组织“约定”规范
  • 钾元素:从基础认知到多元应用与前沿探索
  • 如何短时间内精准定位指标异动根源
  • Geogebra 绘制 电磁波反射折射+斯涅尔定律+半波损失
  • Mia for Gmail for Mac 邮件管理软件
  • EXCEL VBA 清空Excel工作表(Sheet)的方法
  • kafka如何保证消息的顺序性
  • Python快速入门专业版(十):字符串特殊操作:去除空格、判断类型与编码转换
  • 【数据分析】微生物组数据的批次校正与分析
  • 技术前瞻:衡石Data Agent在多模态AI与复杂数据源下的扩展与挑战
  • 如何通过 Activepieces 实现智能工作流自动化