Spring AMQP(3.1.1)设置ConfirmCallback和ReturnsCallback

文章目录

  • 一、起因
  • 二、代码
      • 1. 定义exchange和queue
      • 2. RabbitTemplate
      • 3. EnhancedCorrelationData
      • 4. 发送消息

环境如下

Version
SpringBoot3.2.1
spring-amqp3.1.1
RabbitMq3-management

一、起因

老版本的spring-amqpCorrelationData上设置ConfirmCallback。但是今天却突然发现correlationData.getFuture()没有addCallback函数了。

查询文档和帖子后,发现ConfirmCallbackReturnsCallback都需要在RabbitTemplate中设置,同时ConfirmCallback中默认无法得到消息内容,如果想在ConfirmCallback中把消息内容存到数据库等地方进行记录,怎么办呢?

参考手册

  • Spring AMQP 3.1.1
  • Spring AMQP 3.1.1 API

二、代码

1. 定义exchange和queue

@Slf4j
@Configuration
public class PayNotifyConfig{//交换机public static final String PAYNOTIFY_EXCHANGE_FANOUT = "paynotify_exchange_fanout";//支付通知队列public static final String PAYNOTIFY_QUEUE = "paynotify_queue";//支付结果通知消息类型public static final String MESSAGE_TYPE = "payresult_notify";//声明交换机,且持久化@Bean(PAYNOTIFY_EXCHANGE_FANOUT)public FanoutExchange paynotify_exchange_fanout() {// 三个参数:交换机名称、是否持久化、当没有queue与其绑定时是否自动删除return new FanoutExchange(PAYNOTIFY_EXCHANGE_FANOUT, true, false);}//支付通知队列,且持久化@Bean(PAYNOTIFY_QUEUE)public Queue paynotify_queue() {return QueueBuilder.durable(PAYNOTIFY_QUEUE).build();}//交换机和支付通知队列绑定@Beanpublic Binding binding_paynotify_queue(@Qualifier(PAYNOTIFY_QUEUE) Queue queue, @Qualifier(PAYNOTIFY_EXCHANGE_FANOUT) FanoutExchange exchange) {return BindingBuilder.bind(queue).to(exchange);}
}

2. RabbitTemplate

在上面的类中继续添加RabbitTemplate ,并设置ConfirmCallbackReturnsCallback

	@Beanpublic RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory) {final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);//设置confirm callbackrabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {String body = "1";if (correlationData instanceof EnhancedCorrelationData) {body = ((EnhancedCorrelationData) correlationData).getBody();}if (ack) {//消息投递到exchangelog.debug("消息发送到exchange成功:correlationData={},message_id={} ", correlationData, body);System.out.println("消息发送到exchange成功:correlationData={},message_id={}"+correlationData+body);} else {log.debug("消息发送到exchange失败:cause={},message_id={}",cause, body);System.out.println("消息发送到exchange失败:cause={},message_id={}"+cause+body);}});//设置return callbackrabbitTemplate.setReturnsCallback(returned -> {Message message = returned.getMessage();int replyCode = returned.getReplyCode();String replyText = returned.getReplyText();String exchange = returned.getExchange();String routingKey = returned.getRoutingKey();// 投递失败,记录日志log.error("消息发送失败,应答码{},原因{},交换机{},路由键{},消息{}",replyCode, replyText, exchange, routingKey, message.toString());});return rabbitTemplate;}

3. EnhancedCorrelationData

原始的CorrelationData,目前已经无法从中获取消息内容,也就是说现在的ConfirmCallback无法获取到消息的内容,因为设计上只关注是否投递到exchange成功。如果需要在ConfirmCallback中获取消息的内容,需要扩展这个类,并在发消息的时候,放入自定义数据。

public class EnhancedCorrelationData extends CorrelationData {private final String body;public EnhancedCorrelationData(String id, String body) {super(id);this.body = body;}public String getBody() {return body;}
}

4. 发送消息

EnhancedCorrelationData把消息本身放进去,或者如果你有表记录消息,你可以只放入其id。这样触发ConfirmCallback的时候,就可以获取消息内容。

		public void notifyPayResult() {String message = "TEST Message";Message message1 = MessageBuilder.withBody(message.getBytes(StandardCharsets.UTF_8)).setDeliveryMode(MessageDeliveryMode.PERSISTENT).build();CorrelationData correlationData = new EnhancedCorrelationData(UUID.randomUUID().toString(), message.toString());rabbitTemplate.convertAndSend(PayNotifyConfig.PAYNOTIFY_EXCHANGE_FANOUT,"", message1, correlationData);}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/685203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非常详细!操作系统【IO核心子系统】

🌈个人主页:godspeed_lucip 🔥 系列专栏:OS从基础到进阶 🏆🏆本文完整PDF源文件请翻阅至文章底部下载。🏆🏆 1 I/O核心子系统——概述1.1 核心子系统要完成的功能1.1.1 假脱机技术1…

Python 异常处理及程序调试

Python 是一门功能强大而又易于学习的编程语言,它提供了丰富的工具和库来帮助开发者编写高效、稳定的程序。然而,在编写复杂的应用程序时,错误和异常是难以避免的。本文将介绍 Python 中的异常处理机制以及程序调试技巧,帮助读者提…

JavaScript中什么是事件委托

JavaScript 中的事件委托(Event delegation)是一种重要的编程技术,它能够优化网页中的事件处理,提高程序的性能和可维护性。本文将详细介绍事件委托的概念、工作原理,并提供示例代码来说明其实际应用。 事件委托是基于…

Linux版Black Basta勒索病毒针对VMware ESXi服务器

前言 Black Basta勒索病毒是一款2022年新型的勒索病毒,最早于2022年4月被首次曝光,主要针对Windows系统进行攻击,虽然这款新型的勒索病毒黑客组织仅仅才出来短短两个多月的时间,就已经在其暗网平台上已经公布了几十个受害者之多&…

【案例8】用户中心实现涉及内容和过程

图1 如图1是用盒子模型内容实现的,但是需要了解一些内容。 一.内容知识引入 1.内边距属性(padding) 为了调整盒子在网页中的显示位置,常常需要为元素设置内边距。内边距也被称为内填充,是指元素内容和边框之间的距离…

linux安装mysql8且初始化表名忽略大小写

mysql8下载地址 MySQL8.0安装步骤 1、把安装包上传到linux系统,解压、重命名并移动到/usr/local/目录: cd ~ tar -xvf mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz mv mysql-8.0.32-linux-glibc2.12-x86_64/ mysql80/ mv mysql80/ /usr/local/2、在M…

VMwareWorkstation17.0虚拟机安装Windows2.03完整详细步骤图文教程

VMwareWorkstation17.0虚拟机安装Windows2.03完整详细步骤图文教程 第一篇 下载Windows2.03第二篇 配置Windows2.03虚拟机机器环境第三篇 启动Windows2.03系统 第一篇 下载Windows2.03 1.Windows2.0原版软盘下载地址是 暂不提供,后续更新 2.Windows2.03虚拟机镜像下…

鸿蒙开发-HarmonyOS UI架构

初步布局Index 当我们新建一个工程之后,首先会进入Index页。我们先简单的做一个文章列表的显示 class Article {title?: stringdesc?: stringlink?: string }Entry Component struct Index {State articles: Article[] []build() {Row() {Scroll() {Column() …

GiantPandaCV | 视觉类表面缺陷检测项目相关技术总结

本文来源公众号“GiantPandaCV”,仅用于学术分享,侵权删,干货满满。 原文链接:视觉类表面缺陷检测项目相关技术总结 本文由海滨撰写,首发于GaintPandaCV。 零、前言 做这个方向的项目也有一段时间了,作为…

Deep learning学习笔记

lec 1:Regression 1.5 Linear neural networks for regression线性神经网络的回归 I parameterizing output layer, I handling data, I specifying loss function, I training model. 浅层网络包括线性模型,其中包含了许多经典的统计预测方法&…

C++中的拷贝构造函数

一、拷贝构造函数的概念 拷贝构造函数用于创建一个与已有对象相同的对象,本质上也是构造函数的重载 拷贝构造函数只有一个类型为 const 类类型引用的形参,当我们要创建一个与已存在对象相同的对象时,由编译器自动调用拷贝构造函数。 clas…

简单的edge浏览器插件开发记录

今天在浏览某些网页的时候,我想要屏蔽掉某些信息或者修改网页中的文本的颜色、背景等等。于是在浏览器的控制台中直接输入JavaScript操作dom完成了我想要的功能。但是每次在网页之间跳转该功能都会消失,我需要反复复制粘贴js脚本,无法实现自动…

MATLAB知识点:exprnd函数(★★☆☆☆)生成指数分布的随机数

讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章:课后习题讲解中拓展的函数 在讲解第三…

【革新你的社交形象】用AI创意头像应用,让你的头像独一无二!

在这个数字化时代,社交媒体已经成为我们生活中不可或缺的一部分。你是否曾经为了找到一个既能表达自己个性,又足够吸引眼球的头像而苦恼?现在,有了我们全新推出的AI创意头像应用,你的这一困扰将成为过去! …

React入门到精通:掌握前端开发的必备技能!

介绍:React是一个由Facebook开发和维护的JavaScript库,用于构建用户界面,特别是用于构建单页应用程序和移动应用程序的用户界面。以下是对React的详细介绍: 虚拟DOM:React通过使用虚拟DOM(Document Object …

【Deep Learning 2】神经网络的优化

🌞欢迎来到PyTorch的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 📆首发时间:🌹2024年2月16日&a…

java8-重构、测试、调试

8.1.1 改善代码的可读性 改善代码的可读性到底意味着什么?我们很难定义什么是好的可读性,因为这可能非常主观。通常的理解是,“别人理解这段代码的难易程度”。改善可读性意味着你要确保你的代码能非常容易地被包括自己在内的所有人理解和维护。为了确保…

阿里云“BGP(多线)”和“BGP(多线)_精品”区别价格对比

阿里云香港等地域服务器的网络线路类型可以选择BGP(多线)和 BGP(多线)精品,普通的BGP多线和精品有什么区别?BGP(多线)适用于香港本地、香港和海外之间的互联网访问。使用BGP&#xf…

悦纳自己:拥抱个人局限,开启成长之旅

悦纳自己:拥抱个人局限,开启成长之旅 在人生的旅途中,我们每个人都会面临无数的挑战和选择。有时我们会因为这些挑战而感到焦虑和不安,因为我们害怕失败,害怕无法达到预期的目标。然而,真正重要的是我们如何…

Selenium实战教程系列(三)--- Selenium中的动作

Selenium中针对元素进行的动作在代码中可以分为两类: Selenium::WebDriver::ActionBuilder类中的动作方法Selenium::WebDriver::Element类中的动作方法 其中ActionBuilder类中的动作方法比较丰富,基本涵盖了所有可以进行的操作。 而Element类的动作比较…