Java 中 RabbitMQ 怎么在发送端开启 ConfirmListener 确认机制保证消息百分百送达交换机

云丽姑娘_5968

云丽姑娘_5968

2026-07-25

216人浏览

原创

要实现消息百分百送达交换机,需启用publisher confirms并注册ConfirmCallback:先调用channel.confirmSelect()开启确认模式,再通过addConfirmListener()监听ack(成功抵达交换机)与nack(路由失败),注意该机制仅保障到交换机,不保证入队或消费。

java 中 rabbitmq 怎么在发送端开启 confirmlistener 确认机制保证消息百分百送达交换机

要在 Java 中通过 RabbitMQ 发送端开启 ConfirmListener 实现消息百分百送达交换机,核心是启用 publisher confirms 并注册 ConfirmCallback 监听器。这不保证消息被消费,但能确保消息成功到达 RabbitMQ 服务端的交换机(即被 Broker 接收并完成路由判断)。

1. 开启 Channel 的 confirm 模式

在获取 Channel 后,必须显式调用 channel.confirmSelect(),否则 ConfirmCallback 不会触发。这是启用确认机制的前提,否则即使加了监听器也无效。

  • 该方法需在发送消息前调用,且每个 Channel 只需调用一次
  • 注意:它会使 Channel 进入“confirm 模式”,此时不能再用于事务(transaction)操作
  • 若使用 Spring AMQP,对应配置为 spring.rabbitmq.publisher-confirm-type=correlated

2. 注册 ConfirmCallback 监听器

通过 channel.addConfirmListener() 注册回调,监听每条消息是否成功进入交换机。RabbitMQ 在消息成功路由到交换机后(无论是否有队列绑定),会异步返回 ack;如果交换机不存在或路由失败(如 no-route),则返回 nack。

docker-container-rerun-all
docker-container-rerun-all

顺序检查并可选更新所有已在长期记忆中记录了固定重建命令的 docker run 容器。使用场景:用户...

下载
  • ack:消息已成功抵达交换机(不等于投递到队列)
  • nack:消息被交换机拒绝(例如 exchange 不存在、routing key 无匹配队列且 mandatory=false)
  • 回调中的 deliveryTag 是唯一标识,可用于关联原始消息(需自行维护映射)

3. 发送消息并关联业务逻辑

发送时建议使用 channel.basicPublish(...) 的标准方式,并配合 deliveryMode=2(持久化)提升可靠性。注意 ConfirmCallback 是异步的,不能直接阻塞等待结果,需结合本地缓存 + 定时重发或状态标记来处理 nack 场景。

  • 可将消息 ID(如 UUID)作为 messageId 放入消息属性,再在 ack/nack 回调中根据 deliveryTag 查找对应消息做后续处理
  • 对 nack 消息,应记录日志、告警,并考虑重新发送或转入死信流程
  • 避免在回调里执行耗时操作(如 DB 写入),建议投递到本地队列由单独线程处理

4. 注意事项与常见误区

Confirm 机制只覆盖“消息到达交换机”这一环节,不涉及队列是否存在、消费者是否在线、消息是否被签收等后续阶段。要实现端到端可靠投递,还需配合 mandatory 标志、备份交换机、消费者手动 ack、死信队列等机制。

  • 未调用 confirmSelect() → ConfirmCallback 完全不生效
  • 误把 ack 当作“消息已入队”或“已被消费”→ 语义理解错误
  • 大量消息快速发送时,deliveryTag 是单调递增 long 值,不是消息序号,需自己维护映射关系
  • Channel 关闭或连接中断时,未确认的消息不会自动重发,需应用层兜底

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux rabbitmq docker java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11277

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8382

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7232

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1204

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

968

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1456

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2969

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20231

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1295

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习