【SpringBoot】 整合RabbitMQ 保证消息可靠性传递

news2024/12/23 19:25:19

生产者端

目录结构

导入依赖

修改yml

业务逻辑

测试结果


生产者端

目录结构

导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
        <version>2.5.0</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

修改yml

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    publisher-confirm-type: correlated # 开启确认回调
    publisher-returns: true # 开启退回回调

        在publisher-confirm-type中有三个确认消息接受类型:none、correlated、simple。

        publisher-confirm-type: none 表示禁用发布确认模式。是默认值。使用此模式之后,不管消息有没有发送到Broker(RabbitMQ)都不会触发ConfirmCallback回调。

        publisher-confirm-type: correlated 表示消息成功到达Broker后触发ConfirmCalllBack回调。

        publisher-confirm-type: simple 表示如果消息成功到达Broker后一样会触发ConfirmCalllBack回调,发布消息成功后使用rabbitTemplate调用waitForConfirms()或waitForConfirmsOrDie()方法等待Broker节点返回发送结果,根据返回结果来判定下一步的逻辑。如果waitForConfirmsOrDie()方法如果返回false则会关闭channel信道,则接下来无法发送消息到Broker。

业务逻辑

@SpringBootTest
@RunWith(SpringRunner.class)
class RabbitmqProducerApplicationTests {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    void testProducer() {
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            //三个参数分别为:相关配置消息、交换机是否收到消息、未收到消息的原因
            @Override
            public void confirm(CorrelationData correlationData, boolean b, String s) {
                if(b) System.out.println("交换机成功接受到了消息");
                else System.out.println("消息失败原因" + s);
            }
        });
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            //五个参数分别为:消息对象、失败状态码、失败信息、交换机名称、路由键
            @Override
            public void returnedMessage(Message message, int i, String s, String s1, String s2) {
                System.out.println("队列接受不到交换机的消息进行了失败回调");
            }
        });
        rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"test.heHe","HelloWorld");
    }
}

测试结果

        为了测试是否进行了确认回调方法即confirmCallBack()方法,我将上方的交换机名称故意写错

rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME + "1","test.heHe","HelloWorld");

        为了测试是否进行了退回回调方法即returnCallBack()方法,我将上方的路由键名称故意写错

rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"t.heHe","HelloWorld");

总结

        经上方两次测试,可以使用ConfirmCallBack与ReturnCallBack来确认消息的可靠性传递。ConfirmCallBack是确认交换机是否可以成功接收到消息,而ReturnCallBack是确认队列是否可以成功接收到交换机发来的消息。这是作为解决作为消息发送方希望杜绝任何消息丢失或者投递失败场景。 但需要注意的是在yml中必须添加两行配置。

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

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

相关文章

无人机集群路径规划:淘金优化算法(Gold rush optimizer,GRO)提供MATLAB代码

一、淘金优化算法GRO 淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;由Kamran Zolf于2023年提出&#xff0c;其灵感来自淘金热&#xff0c;模拟淘金者进行黄金勘探行为。 参考文献&#xff1a; K. Zolfi. Gold rush optimizer: A new population-ba…

Python小姿势 - #### Python技术博客:Python多线程编程

Python技术博客&#xff1a;Python多线程编程 你好&#xff0c;这里是自媒体技术博主Aurora&#xff0c;今天我想分享一下Python多线程编程。 首先&#xff0c;什么是多线程编程&#xff1f;多线程编程是一种让多个线程同时执行的编程方式&#xff0c;它可以让程序的执行更加高…

2023年华中杯C题计算结果

经过一晚上代码的编写&#xff0c;论文的写作&#xff0c;C题完整版论文已经发布&#xff0c; 注&#xff1a;蓝色字体为说明备注解释字体&#xff0c;不能出现在大家的论文里。黑色字体为论文部分&#xff0c;大家可以根据红色字体的注记进行摘抄。对应的详细的写作视频教程&…

推荐一款网站内链爬取python脚本

目标 使用 web-tools 提供的webSpider来爬取网站内链&#xff0c;并且将其导出。 webSpider介绍&#xff1a; 官网链接&#xff1a;https://web-tools.cn/web-spider 仓库地址&#xff1a;https://github.com/duerhong/web-spider Web Spider 专门用于爬取网站内链&#xf…

C++ srand()和rand()用法

参考C rand 与 srand 的用法 计算机的随机数都是由伪随机数&#xff0c;即是由小M多项式序列生成的&#xff0c;其中产生每个小序列都有一个初始值&#xff0c;即随机种子。&#xff08;注意&#xff1a; 小M多项式序列的周期是65535&#xff0c;即每次利用一个随机种子生成的随…

论文学习笔记:Transformer Attention Is All You Need

Transformer: Attention Is All You Need 2022 年年底&#xff0c;一个大语言模型 ChatGPT 横空出世&#xff0c;并且迅速点燃了普罗大众对 AI 的热情&#xff0c;短短两个月&#xff0c; ChatGPT 就成为了史上最快成为上亿月活的应用&#xff0c;并且持续受到关注&#xff0c…

【Vue2.0源码学习】变化侦测篇-Object的变化侦测

文章目录 1. 前言2. 使Object数据变得“可观测”3. 依赖收集3.1 什么是依赖收集3.2 何时收集依赖&#xff1f;何时通知依赖更新&#xff1f;3.3 把依赖收集到哪里 4. 依赖到底是谁5. 不足之处6. 总结 1. 前言 我们知道&#xff1a;数据驱动视图的关键点则在于我们如何知道数据发…

记录docker swarm的使用

在前面的几篇文章中我们依次学习了dockerfile、docker-compose的使用&#xff0c;接下来是docker有一个比较 重要的使用&#xff0c;docker swarm的使用&#xff0c;与dockerfile和docker-compose相比较而言&#xff0c;docker swarm是在 多个服务器或主机上创建容器集群服务准…

Leetcode——66. 加一

&#x1f4af;&#x1f4af;欢迎来到的热爱编程的小K的Leetcode的刷题专栏 文章目录 1、题目2、暴力模拟(自己的第一想法)3、官方题解 1、题目 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。最高位数字存放在数组的首位&#xff0c; 数组…

CTF-PHP反序列化漏洞2-典型题目

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…

【纯属娱乐】随机森林预测双色球

目录 一、数据标准化二、预测代码三、后续 一、数据标准化 首先&#xff0c;我们需要对原始数据进行处理&#xff0c;将其转换为可用于机器学习的格式。我们可以将开奖号码中的红球和蓝球分开&#xff0c;将其转换为独热编码&#xff0c;然后将其与期数一起作为特征输入到机器…

ETL工具 - Kettle 查询、连接、统计、脚本算子介绍

一、 Kettle 上篇文章对 Kettle 流程、应用算子进行了介绍&#xff0c;本篇对查询、连接、统计、脚本算子进行讲解&#xff0c;下面是上篇文章的地址&#xff1a; ETL工具 - Kettle 流程、应用算子介绍 二、查询算子 数据输入使用 MySQL 表输入&#xff0c;表结构如下&#x…

给httprunnermanager接口自动化测试平台换点颜色瞧瞧

文章目录 一、背景1.1、修改注册表单的提示颜色1.2、修改后台代码&#xff1a;注册错误提示&#xff0c;最后提交注册&#xff0c;密码校验&#xff1b;1.3、修改了注册&#xff0c;那登录呢&#xff0c;也不能放过二、总结 一、背景 虽然咱给HttpRunnerManger引入进来&#xf…

【云台】开源版本SimpleBGC的电机驱动与控制方式

前言 最近想学习一下云台&#xff0c;发现资料确实还不太好找&#xff0c;比较有参考价值的是俄版的开源版本的云台代码&#xff0c;后面就不开源了&#xff0c;开源版本的是比较原始的算法&#xff0c;差不多是玩具级别的&#xff0c;不过还是决定学习一下&#xff0c;了解一…

PyCaret:低代码自动化的机器学习工具

PyCaret简介 随着ChatGPT和AI画图的大火&#xff0c;机器学习作为实现人工智能的底层技术被大众越来越多的认知&#xff0c;基于机器学习的产品也越来越多。传统的机器学习实现方法需要较强的编程能力和数据科学基础&#xff0c;这使得想零基础尝试机器学习变得非常困难。 机器…

Ucore lab5

实验目的 了解第一个用户进程创建过程了解系统调用框架的实现机制了解ucore如何实现系统调用sys_fork/sys_exec/sys_exit/sys_wait来进行进程管理 实验内容 练习0:已有实验代码改进 ​本实验中完成了用户进程的创建&#xff0c;能够对用户进程进行基本管理&#xff0c;并为…

C语言入门篇——自定义数据篇

目录 1、结构体 1.2、匿名结构体 1.3、结构体的自引用 1.4、结构体的声明和初始化 1.5、结构体的内存对齐 1.6、修改默认对齐数 1.7、结构体传参 2、枚举 3、共用体&#xff08;联合体&#xff09; 1、结构体 设计程序时&#xff0c;最重要的步骤之一是选择表示数据的…

【微机原理】8088/8086微处理器

目录 一、8088/8086的功能结构 1.总线接口部件&#xff08;BIU&#xff09; 2.执行部件&#xff08;EU&#xff09; 二、8088/8086的寄存器结构&#xff08;14个&#xff09; 溢出标志的概念 溢出和进位的区别 8086CPU是Intel系列的16位微处理器&#xff0c;他有16根数据…

框架学习之KOCA框架简介

KOCA框架简介 什么是KOCA术语定义发展历史 KOCA的总体架构产品优势开放性敏捷性&#xff08;一体化解决方案&#xff09;融合性安全性接入网关- KOCA Gateway KOCA DevOps流水线 KOCA技术栈 金证开发者社区&#xff1a;http://koca.szkingdom.com/ 什么是KOCA KOCA是金证基于…

LC-1376. 通知所有员工所需的时间(DFS:自上而下、自下而上)

1376. 通知所有员工所需的时间 难度中等125 公司里有 n 名员工&#xff0c;每个员工的 ID 都是独一无二的&#xff0c;编号从 0 到 n - 1。公司的总负责人通过 headID 进行标识。 在 manager 数组中&#xff0c;每个员工都有一个直属负责人&#xff0c;其中 manager[i] 是第…