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

RabbitMQ:发送者的可靠性之使用消息确认回调

文章目录

    • 配置RabbitMQ的ConfirmCallback
    • 使用ConfirmCallback发送消息
    • 实际使用中的注意事项
    • 总结

在开发消息驱动的系统时,消息的可靠传递至关重要。而RabbitMQ作为一个广泛使用的消息队列中间件,提供了多种消息确认机制,确保消息从生产者到交换器,再到队列的传递都能被监控和确认。今天,我想分享一下如何在Spring中配置和使用RabbitMQ的消息确认回调功能,并讨论一些实际使用中的注意事项。

配置RabbitMQ的ConfirmCallback

首先,我们需要在application.ymlapplication.properties中配置RabbitTemplate,使其支持消息确认回调:

spring:rabbitmq:publisher-confirm-type: correlated # 开启publisher confirm机制,并设置confirm类型publisher-returns: true # 开启publisher return机制

这些配置项用于开启RabbitMQ的消息确认(publisher confirm)和消息返回(publisher return)机制。接下来,我们需要在Spring的配置类中进行相应的配置:

package com.itheima.publisher.config;import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;@Slf4j
@Configuration
@RequiredArgsConstructor
public class MqConfig {private final RabbitTemplate rabbitTemplate;@PostConstructpublic void init() {rabbitTemplate.setReturnsCallback(returned -> {log.error("触发return callback,");log.debug("exchange: {}", returned.getExchange());log.debug("routingKey: {}", returned.getRoutingKey());log.debug("message: {}", returned.getMessage());log.debug("replyCode: {}", returned.getReplyCode());log.debug("replyText: {}", returned.getReplyText());});}
}

在这个配置类中,我们通过@PostConstruct注解的方法初始化了RabbitTemplate的ReturnsCallback。这一回调方法会在消息无法路由到队列时被触发,记录详细的错误信息。

使用ConfirmCallback发送消息

接下来,我们来看如何在发送消息时使用ConfirmCallback来确认消息是否成功发送到交换器:

@Test
public void testConfirmCallback() throws InterruptedException {// 0.创建correlationDataCorrelationData cd = new CorrelationData(UUID.randomUUID().toString());cd.getFuture().addCallback(new ListenableFutureCallback<CorrelationData.Confirm>() {@Overridepublic void onFailure(Throwable ex) {log.error("spring amqp 处理确认结果异常", ex);}@Overridepublic void onSuccess(CorrelationData.Confirm result) {// 判断是否成功if (result.isAck()) {log.debug("收到ConfirmCallback ack,消息发送成功");} else {log.error("收到ConfirmCallback nack,消息发送失败!reason:{}", result.getReason());}}});// 1.交换名String exchangeName = "hmall.direct";// 2.消息String message = "hello everyone";rabbitTemplate.convertAndSend(exchangeName, "blue222", message, cd);Thread.sleep(2000); // 或更长时间
}

在这个测试方法中,我们首先创建了一个CorrelationData对象,并为其添加了回调方法。这个回调方法在消息发送成功或失败时会被触发,从而记录相关日志信息。然后,我们指定交换器名称和消息内容,使用RabbitTemplate的convertAndSend方法发送消息并附带CorrelationData对象。

实际使用中的注意事项

虽然开启生产者确认机制能够有效保证消息传递的可靠性,但这种机制会消耗更多的MQ性能。因此,在实际使用中,需要慎重考虑是否开启生产者确认机制。下面是几种会触发确认的情况:

  1. 路由失败:一般是因为RoutingKey错误导致,往往是编程错误引起的。
  2. 交换机名称错误:同样是编程错误导致。
  3. MQ内部故障:这种情况需要处理,但发生概率较低。

因此,只有在对消息可靠性要求非常高的业务场景中才需要开启生产者确认机制,并且只需要开启ConfirmCallback处理nack即可。对于一般的业务场景,建议通过完善的编码规范和严格的测试来避免上述编程错误,从而减少不必要的性能开销。

总结

通过以上配置和代码,我们可以实现对RabbitMQ消息的确认回调,从而提高消息传递的可靠性。在实际开发中,这种机制可以帮助我们更好地监控和管理消息传递过程中的各种问题,确保消息的准确投递。然而,需要根据具体业务需求权衡性能和可靠性之间的关系。

相关文章:

RabbitMQ:发送者的可靠性之使用消息确认回调

文章目录 配置RabbitMQ的ConfirmCallback使用ConfirmCallback发送消息实际使用中的注意事项总结 在开发消息驱动的系统时&#xff0c;消息的可靠传递至关重要。而RabbitMQ作为一个广泛使用的消息队列中间件&#xff0c;提供了多种消息确认机制&#xff0c;确保消息从生产者到交…...

HCIP学习 | OSPF---LSA限制、不规则区域、附录E、选路

目录 Days06&#xff08;24.8.8&#xff09;OSPF---LSA限制、不规则区域、附录E、选路 特殊区域 stub 区域&#xff0c; 末节区域 Totally stub &#xff1a;完全的末节区域 NSSA区域&#xff1a;(not so stub area) 非完全末节区域 完全的非完全的末节区域&#xff1a; …...

CVE-2017-15715~Apache解析漏洞【春秋云境靶场渗透】

Apache解析漏洞 漏洞原理 # Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。比如如下配置文件&#xff1a; AddType text/html .html AddLanguage zh-CN .cn# 其给 .html 后缀增加了 media-type &#xff0c;值为 text/html &#xff1b;给 …...

thinkphp 5.0.24生成模块

访问的形式生成模块&#xff1a; 1、需要在入口文件Public/index.php中加入以下代码&#xff1a; //生成Home模块&#xff0c;添加以下这句后&#xff0c;打开浏览器执行&#xff1a;http://www3.phptp5.com/public/index.php自动生成Home模块 \think\Build::module(Home); …...

值得注意!家里有带毛发动物就有浮毛?宠物空气净化器一键净化

上次跟朋友逛完街去她家&#xff0c;她家热情的哈基米开门就一个猛冲&#xff0c;我朋友接住就是一顿猛亲&#xff0c;亲猫一时爽&#xff0c;汗液粘着猫毛&#xff0c;粘得满手臂、满脸都是&#xff0c;看得鼻炎星人头皮发麻...好多养宠物的都说&#xff0c;梳毛根本不管用&am…...

Linux 代理(proxy)设置

有关网络代理的环境变量 环境变量说明可选的取值http_proxyhttp协议的网络连接使用该代理。ip:porthttp://ip:portsocks://ip:portsocks4://ip:portsocks5://ip:porthttps_proxyhttps协议的网络连接使用该代理。ftp_proxyftp协议使用该代理。all_proxy所有网络协议的网络连接都…...

操作系统真相还原:获取文件属性

14.15 获得文件属性 14.15.1 ls命令的幕后功臣 ls 命令中调用了大量的系统调用 stat64 和write &#xff0c;其中stat64 用于获得文件的属性信息&#xff0c; write 用于把信息输出到屏幕&#xff0c;即标准输出。这里的 stat64 表示 64 位版本的 stat。 其函数原型是int sta…...

聚鼎装饰画:投资一家装饰画店铺要花费多少钱

在艺术的殿堂里&#xff0c;每一幅装饰画都是静默的诗篇&#xff0c;而开设一家装饰画店铺&#xff0c;便是将这份静谧与美好呈现给世界的开始。然而&#xff0c;背后的投资成本&#xff0c;却是一笔需要精打细算的账。 店铺的选址&#xff0c;犹如画家挑选画布&#xff0c;至关…...

编程的魅力、其重要性、学习方法以及未来趋势

在数字化时代&#xff0c;编程已不仅仅是程序员的专属技能&#xff0c;它逐渐渗透到我们生活的方方面面&#xff0c;成为连接现实与虚拟世界的桥梁。从日常使用的智能手机应用到探索宇宙奥秘的超级计算机&#xff0c;编程的力量无处不在。本文将深入探讨编程的魅力、其重要性、…...

ubuntu init set

1 cuda驱动 cuda use not open test 自己下载安装 以上操作后可能是核显卡&#xff0c;需要执行下列进入独立显卡&#xff0c;才能进行HDMI链接 sudo prime-select nvidia sudo prime-select intel prime-select query 该命令用于查看目前的显卡使用模式&#xff0c;可以看到…...

MySQL数据分析进阶(八)存储过程

※食用指南&#xff1a;文章内容为‘CodeWithMosh’SQL进阶教程系列学习笔记&#xff0c;笔记整理比较粗糙&#xff0c;主要目的自存为主&#xff0c;记录完整的学习过程。&#xff08;图片超级多&#xff0c;慎看&#xff01;&#xff09; 【中字】SQL进阶教程 | 史上最易懂S…...

最深的根,

1498. 最深的根 题目 提交记录 讨论 题解 视频讲解 一个无环连通图可以被视作一个树。 树的高度取决于所选取的根节点。 现在&#xff0c;你要找到可以使得树的高度最大的根节点。 它被称为最深的根。 输入格式 第一行包含整数 NN&#xff0c;表示节点数量。 节点…...

【常见的设计模式】工厂模式

【设计模式专题之工厂方法模式】2.积木工厂   题目描述 小明家有两个工厂&#xff0c;一个用于生产圆形积木&#xff0c;一个用于生产方形积木&#xff0c;请你帮他设计一个积木工厂系统&#xff0c;记录积木生产的信息。   输入描述 输入的第一行是一个整数 N&#xff08;1 …...

postgres收缩工具两种工具的使用对比

postgres收缩工具安装和使用 第一章 需要使用插件处理膨胀的原因 Postgresql通过数据多版本实现MVCC,现象是删除数据并不会真正删除数据,而是修改标识,更新是通过删除+插入的方式进行,所以在频繁更新的OLTP系统,会造成数据膨胀。 PG数据库本身有处理膨胀问题的vacuum工…...

仿真入门——CST软件如何设置分布式计算的共享储存

在 CST Studio Suite 的分布式计算中&#xff0c;常有用户因为某台机器的网络问题丢失某个数据。这里介绍一种方法&#xff0c;可以在使用分布式计算或 MPI 计算时设置共享存储。在这种情况下&#xff0c;不涉及文件传输&#xff0c;所有文件操作都在共享文件的媒介上完成。 数…...

【JVM基础17】——实践-说一下JVM调优工具

目录 1- 引言&#xff1a;2- ⭐核心&#xff1a;2-1 命令工具jpsjstackjmapjstat 2-2 可视化工具jconsoleVisualVM 3- 小结&#xff1a;3-1 说一下 JVM 调优的工具 1- 引言&#xff1a; 命令工具 jps——进程状态信息jstack——查看Java进程内线程的堆栈信息jmap——查看堆转…...

【QT】Qt中Websocket的使用

一、WebSocket的定义 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455&#xff0c;并由RFC7936补充规范。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;…...

【vue3】【elementPlus】【国际化】

1.如需从0-1开始&#xff0c;请参考 https://blog.csdn.net/Timeguys/article/details/140995569 2.使用 vue-i18n 模块&#xff1a; npm i vue-i18n3.在 src 目录下创建 locales 目录&#xff0c;里面创建文件&#xff1a;en.js、zh-cn.js、index.js 语言js文件&#xff1a;…...

用python实现求两个整数的最大公约数

def gcd(a, b): """计算最大公约数""" while b: a, b b, a % b return abs(a) 下面是对 gcd 函数的逐行解释&#xff1a; def gcd(a, b):"""计算最大公约数"""定义函数&#xff1a;这里定义了一个名为 gcd…...

Linux 内核源码分析---proc 文件系统

proc文件系统 进程数据文件系统&#xff08;process data filesystem, procfs&#xff09;装载在 /proc&#xff0c;缩写为 procFS。 proc 文件系统是一种虚拟文件系统&#xff0c;其信息不能从块设备读取。只有在读取文件内容时才动态生成相应的信息。使用proc文件系统&…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

C#最佳实践:为何优先使用as或is而非强制转换

C#最佳实践&#xff1a;为何优先使用as或is而非强制转换 在 C# 的编程世界里&#xff0c;类型转换是我们经常会遇到的操作。就像在现实生活中&#xff0c;我们可能需要把不同形状的物品重新整理归类一样&#xff0c;在代码里&#xff0c;我们也常常需要将一个数据类型转换为另…...