SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认

介绍

有Publisher Confirm(成功)和Publisher Return(失败)两种确认机制。开启确机制认后,在MQ成功收到消息后会返回消息给生产者。

  • 消息投递到了MQ ,但是路由失败。此时会通过PublisherReturn返回路由异常原因,然后返回ACK,告知投递成功。
  • 临时消息投递到了MQ,并且入队成功,返回ACK,告知投递成功。
  • 持久消息投递到了MQ,并且入队完成持久化,返回ACK,告知投递成功
  • 其它情况都会返回NACK,告知投递失败

也就是只要返回的是ACK就可以确定是消息发送成功了。

配置生产者确认

spring:rabbitmq:host: 128.92.13.281port: 5673 #通信端口virtual-host: /csdn #虚拟主机名称username: c123password: 123456aapublisher-confirm-type: correlated #开启Publisher Confirm  并设置Confirm类型publisher-returns: true #开启Publisher return机制
  • publisher-confirm-type: correlated #MQ异步回调方式返回回执消息
  • publisher-confirm-type: none #关闭Confirm机制
  • publisher-confirm-type: simple #同步阻塞MQ回执消息

RetrunCallback回调(失败)

每个RabbitTemplate只能配置一个ReturnCallback,因此需要在项目启动过程中配。

java">@Configuration
@Slf4j
public class RabbitMqConfig  implements ApplicationContextAware {@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {RabbitTemplate rabbitTemplate =applicationContext.getBean(RabbitTemplate.class);rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {@Overridepublic void returnedMessage(ReturnedMessage returnedMessage) {log.debug("消息发送失败",returnedMessage.getMessage(),returnedMessage.getReplyCode(),//代码returnedMessage.getReplyText(),//消息returnedMessage.getRoutingKey(),//路由KeyreturnedMessage.getExchange()  //交换机//拿到失败消息);}});}
}

ConfirmCallback回调(成功)

在每一个消息发送时单独指定

java">private  final RabbitTemplate rabbitTemplate;
@GetMapping("/putRecord") //插入记录
public Result userMessage(){CorrelationData cd=  new CorrelationData(UUID.randomUUID().toString());cd.getFuture().addCallback(new ListenableFutureCallback<CorrelationData.Confirm>() {@Overridepublic void onFailure(Throwable ex) {System.out.println("消息回调失败");}@Overridepublic void onSuccess(CorrelationData.Confirm result) {System.out.println("收到发送确认回执");if (result.isAck()){System.out.println("消息发送成功");}else{System.out.println("消息发送失败了"+result.getReason());}}});rabbitTemplate.convertAndSend("csdn.fanout","acc","发送的消息",cd);return  Result.success("操作成功",null);
}

一般情况下更比较关系NACK消息发送失败。

注意事项

  • 生产者确认需要额外的网络和系统资源开销,尽量不要使用
  • 如果一定要使用,无需开启Publisher-Return机制,因为一般路由失败是自己业务问题
  • 对于nack消息可以有限次数重试,依然失败则记录异常消息

http://www.ppmy.cn/news/1527061.html

相关文章

C++二叉搜索树学习

目录 一、二叉搜索树概念 二、二叉搜索树的性能分析 三、二叉搜索树的构建 一、二叉搜索树概念 二叉搜索树又叫做二叉排序树&#xff0c;它可以是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若该树的左子树不为空&#xff0c;那么左子树上的任一节点都小…

MATLAB系列04:循环结构

MATLAB系列04&#xff1a;循环结构 4. 循环结构4.1 while循环4.2 for循环4.2.1 运算的细节4.2.2 break语句和continue语句4.2.3 嵌套循环 4.3 逻辑数组和向量化4.3.1 逻辑数组的重要性4.3.2 用 if/else 结构和逻辑数组创建等式 4.4 总结 4. 循环结构 循环(loop)是一种 MATLAB …

SprinBoot+Vue工商局商家管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

Linux 文件 IO 管理(第一讲)

Linux 文件 IO 管理&#xff08;第一讲&#xff09; 回顾 C 语言文件操作&#xff0c;提炼理解新创建的文件为什么被放在可执行文件的同级目录下&#xff1f;上述 log.txt 何时被创建&#xff1f;又是谁在打开它&#xff1f;那文件没有被打开的时候在哪里&#xff1f;一个进程可…

计算左边(比自己小的元素)的最长距离

前言&#xff1a;一般做的题目都是使用单调栈来求出距离这个点最近的那个比这个数大或小的元素&#xff0c;但是如果是需要找到最远的那个元素呢&#xff1f;我们可以用到类似逆序对的思路&#xff0c;我们先进行排序从小到大&#xff0c;接着我们先处理左边&#xff0c;每次维…

常见的限流算法

限流算法是用于控制访问频率、保护系统免受过载攻击的重要手段。常见的限流算法有以下几种&#xff0c;每种算法都有不同的应用场景和优缺点。下面是几种常见的限流算法的详细介绍&#xff1a; 1. 计数器算法&#xff08;Counter&#xff09; 原理 计数器算法是最简单的限流…

项目实训:CSS基本布局理解——WEB开发系列38

对CSS学习已经接近尾声&#xff0c;下面你可以对以下两道“小卡拉米”测试进行测试下CSS理解程度。 题 1&#xff1a;基于栅格布局的现代博客首页设计 题目要求&#xff1a; 创建一个博客首页布局&#xff0c;包含一个顶部导航栏、一个主要的内容区域&#xff08;左侧为博客文…

深入了解C语言的内核--数据在内存中的存储

前言&#xff1a;新手开始学C语言&#xff0c;首先学习的是语法&#xff0c;在懂语法的基础上&#xff0c;在去思考解决问题的方法。大家应该也听说过c语言是最接近底层的编程语言吧&#xff0c;所以我认为最重要的是要理解C语言的内核--1.栈帧空间的销毁和创建 2.数据在内存中…

golang中连接达梦数据库使用域名来代替IP时会出现解析问题

中间件使用gorm driverName : "dm" dataSourceName : fmt.Sprintf("dm://%s:%s%s:%s/SYSDBA?charsetutf8&parseTimetrue", config.Database.Username, config.Database.Password, config.Database.Address, config.Database.Port)config.Database.Ad…

注意!Facebook已移除细分定位排除受众的功能

上月&#xff0c;Meta发布更新将移除细分定位排除受众的功能&#xff0c;1月31前现有的使用细分定位排除条件的广告仍可继续投放&#xff0c;但新建广告无法使用细分定位排除功能&#xff0c;1月31后所有使用细分定位排除条件的广告都将无法投放&#xff0c;这就意味着广告主们…

django 通过地址访问本地文件

django 通过地址访问本地文件 在Django中&#xff0c;如果你想通过URL访问本地文件&#xff0c;你可以使用Django的serve视图。首先&#xff0c;你需要配置你的urls.py来匹配文件存储的路径&#xff0c;并且确保文件存储在你的本地文件系统中。 以下是一个简单的例子&#xff…

春秋云境之CVE-2022-30887

一.靶场环境 1.下载靶场环境 根据题目提示&#xff0c;此靶场存在文件上传漏洞。 2.启动靶场环境 我们可以看到是一个登录页面&#xff0c;我们尝试进行登录 二.登录页面 1.尝试进行登录 我们发现用户名必须是邮箱&#xff0c;那么弱口令肯定不行&#xff0c;我们可以看到…

python学习第八节:爬虫的初级理解

python学习第八节&#xff1a;爬虫的初级理解 爬虫说明&#xff1a;爬虫准备工作&#xff1a;分析网站url分析网页内容 爬虫获取数据&#xff1a;1.使用urllib库发起一个get请求2.使用urllib库发起一个post请求3.网页超时处理4.简单反爬虫绕过5.获取响应参数6.完整请求代码 解析…

2024 VMpro 虚拟机中如何给Ubuntu Linux操作系统配置联网

现在这是一个联网的状态 可以在商店里面下载东西 也能ping成功 打开虚拟网络编辑器 放管理员权限 进行设置的更改 选择DNS设置 按提示修改即可 注意的是首选的DNS服务器必须是114.114.114.114 原因 这边刚刚去查了一下 114.114.114.114 是国内的IP地址 8.8.8.8 是国外的I…

高级编程--第七章 XML

1、目标 理解XML该你那及优势 回避那些格式良好的XML文档 了解XML中特殊字符的处理方式 了解解析器概念 了解DOM树节点构造 会使用Dom操作XML数据&#xff08;添加/保存&#xff09; 2、XML简介 XML&#xff08;EXtensible Markup Language&#xff09;,可扩展标记语言&…

@PathVariable,@RequestParam,@RequestBody注解,springboot与前端请求之间的数据类型转换

前端数据与springboot java数据类型转换 springboot&mybatis中数组和字符串数据类型的转换-CSDN博客中曾经提到&#xff0c;在Spring Boot中&#xff0c;通过URL传参、payload中的key-value形式或json形式&#xff0c;将前端数据以字符串格式发送到后端&#xff0c;后端We…

​​​​​​​Oracle11 分析函数等高级函数使用说明

目录 1、Group by 2、Connect by 3、分析函数 4、Model 5、Listagg与自定义聚合函数 1、Group by 与GROUP BY 一起使用的关建字 GROUPING , ROLLUP,CUBE,结合这些特性的函数可以实现SQL的明细分组统计 GROUPING 记录是对哪个字段进行统计 select deptno,job,sum(sal),gro…

[Leetcode LCR 154][Medium]-复杂链表的复制-链表

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 这道题难点在于如何处理random。因为涉及到的所有节点都在同一链表&#xff0c;因此可以在链表上利用复制-拆分的方法去做。 先在链表上把每个节点复制自身一次&#xff0c;相当于cur与cur.ne…

快速提升Python Pandas处理速度的秘诀

大家好&#xff0c;Python的Pandas库为数据处理和分析提供了丰富的功能&#xff0c;但当处理大规模数据时&#xff0c;性能问题往往成为瓶颈。本文将介绍一些在Pandas中进行性能优化的方法与技巧&#xff0c;帮助有效提升数据处理速度&#xff0c;优化代码运行效率。 1.数据类…

【 html+css 绚丽Loading 】 000052 璇玑转轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…