SpringBoot整合RabbitMQ-应答模式
一、应答模式
RabbitMQ 中的消息应答模式主要包括两种:自动应答(Automatic Acknowledgement)和手动应答(Manual Acknowledgement)。(一般交换机发送消息,RabbitMQ只有在接收到消费者的确认后才会将消息从队列中删除。)在队列发送消息时,首先会先复制一份给消费者,在收到消费者的确认消息后,队列才会将队列中的消息删除。

1、自动应答:
不在乎消费者对消息处理是否成功,都会告诉队列删除消息。如果处理消息失败,实现自动补偿(队列投递过去 重新处理)。
2、手动应答:
-
在手动应答模式下,消费者在接收到消息后并不会立即向RabbitMQ确认消息已处理完毕。消费者需要显式调用
basicAck方法来确认消息处理完成,RabbitMQ只有在接收到消费者的确认后才会将消息从队列中删除。 -
采用手动应答可以提高消息的可靠性,即使消费者在处理消息过程中出现问题,只要未发送ack确认,RabbitMQ会在重新连接后再次将消息发送给该消费者。
-
如果消费者在处理消息前断开了连接,或者在处理消息期间抛出了未捕获的异常,RabbitMQ会认为消息未被正确处理,从而重新排队消息,确保消息至少会被消费一次(at least once delivery)。
二、SpringBoot如何实现两种应答。
1、自动应答
在Spring Boot的配置文件application.properties中,对于RabbitMQ监听器,设置自动应答模式(默认就是自动应答)
可以在配置文件中设置自动应答
# 自动应答模式
spring.rabbitmq.listener.simple.acknowledge-mode = auto
@Component
public class AutoAcknowledgementConsumer {@RabbitListener(queues = "yourQueue")public void consumeMessage(String message, Message amqpMessage) {// 处理消息...// 框架会在方法执行完成后自动发送ack确认消息}
}

自动应答的效果:开启自动应答如果出现异常,消费者没有返回确认信息,交换机就会不停发送消息。

会不停的发送请求
2、 手动应答
首先,同样在配置文件中启用手动应答模式
# 手动应答模式
spring.rabbitmq.listener.simple.acknowledge-mode = manual
@RabbitListener(queues = "direct_01")public void receiveMessage(Ordering ordering, Message message, Channel channel) throws IOException {long deliveryTag = message.getMessageProperties().getDeliveryTag();System.out.println("消费者434接收到消息:" + ordering);try {// 处理成功手动发送ack确认,yesint i = 5 / 0;channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {// 处理失败,可以选择重试或拒绝消息(basicNack或basicReject)channel.basicNack(deliveryTag, false, false); // b表示是否批量,b1表示是否并重新入队,选择不重新入队后消息便会丢失}}
3.如何解决死循环?重试机制

#应答模式 手动应答需要开发者手动应答
spring.rabbitmq.listener.simple.acknowledge-mode=AUTO#批量预抓取数量,提高执行效率
spring.rabbitmq.listener.simple.prefetch = 10
#开启消费者重试机制
spring.rabbitmq.listener.simple.retry.enabled = true
#重试的最大次数
spring.rabbitmq.listener.simple.retry.max-attempts = 6
#重试间隔时间
spring.rabbitmq.listener.simple.retry.initial-interval = 3000
#重试间隔倍数,默认值是1
spring.rabbitmq.listener.simple.retry.multiplier = 2
#最大间隔时间,默认值是10s
spring.rabbitmq.listener.simple.retry.max-interval = 15000
四、SimpleMessageListenerContainer和DirectMessageListenerContainer区别
SimpleMessageListenerContainer和DirectMessageListenerContainer都是Spring AMQP提供的消息监听容器,它们之间的区别在于:
-
SimpleMessageListenerContainer是基于AMQP协议的,而DirectMessageListenerContainer是基于RabbitMQ的,因此SimpleMessageListenerContainer可以用于其他的AMQP实现,而DirectMessageListenerContainer只能用于RabbitMQ。
-
SimpleMessageListenerContainer支持订阅多个队列,可以使用通配符等方式进行配置,而DirectMessageListenerContainer只能订阅一个队列。
-
SimpleMessageListenerContainer支持自动声明队列和绑定,而DirectMessageListenerContainer需要手动声明和绑定队列。
-
SimpleMessageListenerContainer支持多线程处理消息,而DirectMessageListenerContainer只能单线程处理消息。
因此,如果需要监听多个队列或者使用其他的AMQP实现,可以选择SimpleMessageListenerContainer;如果只需要监听一个队列并且使用RabbitMQ,可以选择DirectMessageListenerContainer。
相关文章:
SpringBoot整合RabbitMQ-应答模式
一、应答模式 RabbitMQ 中的消息应答模式主要包括两种:自动应答(Automatic Acknowledgement)和手动应答(Manual Acknowledgement)。(一般交换机发送消息,RabbitMQ只有在接收到消费者的确认后才…...
51单片机入门_江协科技_25~26_OB记录的笔记_蜂鸣器教程
25. 蜂鸣器 25.1. 蜂鸣器介绍 •蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号 •蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器(开发板上用的无源蜂鸣器) •有源蜂鸣器:内部自带振荡源&a…...
新能源汽车电池包为什么不通用,车主怎么用电才算对?
一提起新能源车,大部分人可能知道电动汽车,实际上新能源车的种类是比较多的,这里边也包括了插电式混动汽车、纯电汽车、燃料电池汽车,其中插电混动里还包括了串联式、并联式、混联式,每种汽车都各有优缺点,…...
[C语言]——柔性数组
目录 一.柔性数组的特点 二.柔性数组的使用 三.柔性数组的优势 C99中,结构体中的最后⼀个元素允许是未知大小的数组,这就叫做『柔性数组』成员。 typedef struct st_type //typedef可以不写 { int i;int a[0];//柔性数组成员 }type_a; 有些编译器会…...
密码学 总结
群 环 域 群 group G是一个集合,在此集合上定义代数运算*,若满足下列公理,则称G为群。 1.封闭性 a ∈ G , b ∈ G a\in G,b\in G a∈G,b∈G> a ∗ b ∈ G a*b\in G a∗b∈G 2.G中有恒等元素e,使得任何元素与e运算均为元素本…...
尚硅谷html5+css3(1)html相关知识
1.基本标签: <h1>最大的标题字号 <h2>二号标题字号 <p>换行 2.根标签<html> 包括<head>和<body> <html><head><title>title</title><body>body</body></head> </html> 3…...
苍穹外卖11(Apache ECharts前端统计,营业额统计,用户统计,订单统计,销量排名Top10)
目录 一、Apache ECharts【前端】 1. 介绍 2. 入门案例 二、营业额统计 1. 需求分析和设计 1 产品原型 2 业务规则 3 接口设计 2. 代码开发 3. 功能测试 三、用户统计 1. 需求分析和设计 1 产品原型 2 业务规则 3 接口设计 2. 代码开发 3. 功能测试 四、订单统…...
大商创多用户商城系统 多处SQL注入漏洞复现
0x01 产品简介 大商创多用户商城系统是一个功能强大、灵活多变的新零售电商系统服务商。该系统支持平台自营和商家入驻,实现多元化经营模式,能够全面整合供应商、生产商、经销商和消费者等产业链资源,提高产品多样性,加快资金流动速度,并有助于减少不必要的成本输出。 0…...
美团一面4/9
面的时候自我感觉良好,复盘感觉答的一坨。。 0怎么比较两个对象 0Integer 不使用new会自动装箱,返回提前创建的。使用new就创建新对象。 1.Object类有什么方法 java中Object类中有哪些常用方法以及作用_java中object的方法有什么用-CSDN博客 2.hash…...
ubuntu下NTFS分区无法访问挂载-解决办法!
Ubuntu系统下,有的时候发现,挂载的NTFS文件系统硬盘无法访问。点击弹出类似问题: Error mounting /dev/sda1 at /media/root/新加卷: Command-line mount -t "ntfs" -o "uhelperudisks2,nodev,nosuid,uid0,gid0" "/…...
如何在 Ubuntu 14.04 上使用 Rsyslog、Logstash 和 Elasticsearch 实现日志集中管理
Elastic 的一篇文章 介绍 理解组织生成的数百万条日志行可能是一个艰巨的挑战。一方面,这些日志行提供了对应用程序性能、服务器性能指标和安全性的视图。另一方面,日志管理和分析可能非常耗时,这可能会阻碍对这些日益必要的服务的采用。 …...
mapbox 工作问题暂时记录
mapbox 工作问题暂时记录 mapbox样式修改1.2.3.4. mapbox样式修改 1. mapbox直接用class名无法修改样式, 可以添加 :deep 来修改样式 2. map.value.getStyle().layers这行代码可以获取页面中所有图层,可以判断图层id来做相应操作 3. map.value.setLayoutProperty(layer.id…...
Linux、Docker、Brew、Nginx常用命令
Linux、Docker、Brew、Nginx常用命令 Linuxvi编辑器文件操作文件夹操作磁盘操作 DockerBrewNginx参考 Linux vi编辑器 Vi有三种模式。命令模式、输入模式、尾行模式,简单的关系如下: i -- 切换到输入模式,在光标当前位置开始输入文本。&a…...
【Spring实战项目】SpringBoot3整合WebSocket+拦截器实现登录验证!从原理到实战
🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…...
第二证券|政策利好不断,工业母机概念爆发,华东数控等涨停
工业母机概念10日盘中大幅走高,截至发稿,恒进感应、宏德股份、华东重机、华东数控等涨停,凯腾精工涨超20%,创世纪涨逾11%,华辰配备、盘古智能涨超9%,博亚精工涨逾8%。 音讯面上,工业和信息化部…...
Thinkphp5萤火商城B2C小程序源码
源码介绍 Thinkphp5萤火商城B2C小程序源码,是一款开源的电商系统,为中小企业提供最佳的新零售解决方案。采用稳定的MVC框架开发,执行效率、扩展性、稳定性值得信赖。 环境要求 Nginx/Apache/IIS PHP5.4 MySQL5.1 建议使用环境ÿ…...
PostgreSQL介绍
PostgreSQL是一个高度先进的对象关系型数据库管理系(ORDBMS),其起源可以追溯到1986年,最初是加州大学伯克利分校计算机系的一个项目,名为POSTGRES。它是从Ingres项目演变而来的,目的是克服当时关系数据库系…...
简析数据安全保护策略中的十个核心要素
数据显示,全球企业组织每年在数据安全防护上投入的资金已经超过千亿美元,但数据安全威胁态势依然严峻,其原因在于企业将更多资源投入到数据安全能力建设时,却忽视了这些工作本身的科学性与合理性。因此,企业在实施数据…...
Python+Django+Html河道垃圾识别网页系统
程序示例精选 PythonDjangoHtml河道垃圾识别网页系统 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonDjangoHtml河道垃圾识别网页系统》编写代码,代码整洁,规…...
BUUCTF:BUU UPLOAD COURSE 1[WriteUP]
构造一句话PHP木马 <?php eval(system($_POST[shell])); ?> 利用eval函数解析$shell的值使得服务器执行system命令 eval函数是无法直接执行命令的,只能把字符串当作php代码解析 这里我们构造的木马是POST的方式上传,那就用MaxHacKBar来执行 …...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
