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

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,因此需要在项目启动过程中配。

@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回调(成功)

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

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 DDOS,如何防护
  • C++速通LeetCode中等第12题-矩阵置零(空间O(1)含注释)
  • xml中的转义字符
  • Java-使用反射来处理对象,并构建新的JSON数据结构
  • windows C++ 并行编程-异步消息块(四)
  • Java集合(List篇)
  • fiddler抓包06_抓取https请求(chrome)
  • 财富通公司开发维修售后小程序,解决售后维修问题
  • 【摘抄】软件工程师认知
  • 量子噪声流加密(一:整体框架描述)
  • 惠海H6118 DC-DC 降压恒流芯片30V36v40V48V降12V9V24V36V 1.2A大电流 调光降压芯片IC舞台灯
  • 学习CubeIDE——外设中断开发
  • 活动目录安全
  • go注册中心Eureka,注册到线上和线下,都可以访问
  • 聊聊Thread Local Storage
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • C# 免费离线人脸识别 2.0 Demo
  • exif信息对照
  • Laravel 中的一个后期静态绑定
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • spring boot下thymeleaf全局静态变量配置
  • 时间复杂度与空间复杂度分析
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 通过npm或yarn自动生成vue组件
  • 一、python与pycharm的安装
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 如何正确理解,内页权重高于首页?
  • #162 (Div. 2)
  • #vue3 实现前端下载excel文件模板功能
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $().each和$.each的区别
  • (003)SlickEdit Unity的补全
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (39)STM32——FLASH闪存
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (C语言)fread与fwrite详解
  • (定时器/计数器)中断系统(详解与使用)
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (面试必看!)锁策略
  • (推荐)叮当——中文语音对话机器人
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原创)可支持最大高度的NestedScrollView
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)jdk与jre的区别
  • (转)LINQ之路
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)从 Java 代码到 Java 堆