Spring Cloud 集成 RabbitMQ

目录

  • 前言
  • 步骤
    • 引入相关maven依赖
    • 添加相关配置
  • 使用方法
    • 配置消息序列化
    • 创建第一个消息队列和交换机
    • 使用方法
  • 总结

前言

在当今的微服务架构盛行的时代,消息队列作为一种重要的通信机制,在分布式系统中扮演着不可或缺的角色。RabbitMQ,作为一款开源的消息代理和队列服务器,以其高可用性、易扩展性、灵活的路由机制以及多协议支持等特点,深受开发者们的青睐。而Spring Cloud,作为Spring生态中针对微服务架构的一套集成解决方案,也提供了与RabbitMQ的集成支持,使得在Spring Cloud环境下使用RabbitMQ变得更加简单高效。
Spring Cloud集成RabbitMQ,不仅继承了RabbitMQ本身的诸多优点,还充分利用了Spring Cloud的自动配置和声明式编程特性,极大地简化了消息队列的配置和使用过程。开发者可以通过简单的配置和注解,轻松实现消息的发布、订阅、路由和持久化等功能,从而构建出稳定可靠、高性能的分布式系统。
此外,Spring Cloud集成RabbitMQ还提供了丰富的消息处理机制,如消息确认、死信队列、延迟队列等,这些机制可以帮助开发者更好地处理消息丢失、重复消费、消息堆积等问题,提升系统的健壮性和可靠性。

步骤

引入相关maven依赖

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

添加相关配置

spring:  
  rabbitmq:  
    # RabbitMQ服务器的地址  
    host: 127.0.0.1  
    # RabbitMQ服务器的端口号  
    port: 5672  
    # RabbitMQ服务器的用户名  
    username: guest  
    # RabbitMQ服务器的密码  
    password: guest  
    # 消息监听器的配置  
    listener:  
      simple:  
        # 确认模式,这里设置为手动,意味着需要手动确认消息处理成功  
        acknowledge-mode: manual  
        # 消息重试的配置  
        retry:  
          # 是否启用重试机制  
          enabled: true  
          # 最大重试次数  
          max-attempts: 5  
          # 最大重试间隔,单位是毫秒  
          max-interval: 20000ms  
          # 初始重试间隔,单位是毫秒  
          initial-interval: 2000ms  
          # 重试间隔的倍增系数  
          multiplier: 2

使用方法

配置消息序列化

// 定义一个Bean,返回一个MessageConverter实例,用于消息的序列化和反序列化  
@Bean  
public MessageConverter messageConverter() {  
    // 使用Jackson2JsonMessageConverter作为消息转换器,它基于Jackson库进行JSON格式转换  
    return new Jackson2JsonMessageConverter();  
}  
  
// 定义一个Bean,返回一个RabbitTemplate实例,用于发送和接收消息  
@Bean  
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {  
    // 创建一个RabbitTemplate实例,传入连接工厂,用于建立与RabbitMQ的连接  
    RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);  
    // 设置RabbitTemplate的消息转换器,用于将Java对象转换为消息,以及将消息转换为Java对象  
    rabbitTemplate.setMessageConverter(messageConverter);  
    // 返回配置好的RabbitTemplate实例,供其他组件使用  
    return rabbitTemplate;  
}

创建第一个消息队列和交换机

// 定义actuator队列的名称常量  
public static final String ACTUATOR_QUEUE_NAME = "actuator_queue";  
// 定义actuator交换机的名称常量  
public static final String ACTUATOR_EXCHANGE_NAME = "actuator_exchange";  
// 定义actuator路由键的常量  
public static final String ACTUATOR_ROUTING_KEY = "actuator_routing_key";  
  
// 定义一个Bean,用于创建actuator队列  
@Bean  
public Queue actuatorQueue() {  
    // 创建一个持久化队列,队列名称为ACTUATOR_QUEUE_NAME常量定义的值  
    return new Queue(ACTUATOR_QUEUE_NAME, true);  
}  
  
// 定义一个Bean,用于创建actuator交换机  
@Bean  
public DirectExchange actuatorExchange() {  
    // 创建一个Direct类型的交换机,交换机名称为ACTUATOR_EXCHANGE_NAME常量定义的值  
    return new DirectExchange(ACTUATOR_EXCHANGE_NAME);  
}  
  
// 定义一个Bean,用于绑定actuator队列和交换机  
@Bean  
public Binding actuatorBinding(@Qualifier("actuatorQueue") Queue queue, @Qualifier("actuatorExchange") DirectExchange exchange) {  
    // 使用BindingBuilder来绑定actuator队列和actuator交换机  
    // 并指定ACTUATOR_ROUTING_KEY作为路由键  
    return BindingBuilder.bind(queue).to(exchange).with(ACTUATOR_ROUTING_KEY);  
}

使用方法

// 使用RabbitListener注解,指定监听ACTUATOR_QUEUE_NAME队列中的消息  
@RabbitListener(queues = ActuatorBind.ACTUATOR_QUEUE_NAME)  
public void onMessage(TaskInfoBo taskInfoBo, Message message, Channel channel) throws IOException {  
    // 获取消息的属性,并从中提取消息的deliveryTag  
    long deliveryTag = message.getMessageProperties().getDeliveryTag();  
    try {  
        // 执行一些业务逻辑代码......  
        // ...(业务代码省略)  
  
        // 如果业务代码执行成功,则手动确认消息处理成功  
        // deliveryTag用于标识需要确认的消息,false表示是否进行批量确认(这里不进行批量确认)  
        channel.basicAck(deliveryTag, false);  
    } catch (Exception e) {  
        // 如果在业务代码执行过程中出现异常,则手动拒绝该消息  
        // deliveryTag用于标识需要拒绝的消息,false表示是否将消息重新放回队列(这里不重新放回队列)  
        channel.basicReject(deliveryTag, false);  
    }  
}

在这个方法中,我们使用了@RabbitListener注解来声明这个方法是一个消息监听器,它监听ActuatorBind.ACTUATOR_QUEUE_NAME队列中的消息。当消息到达这个队列时,Spring会调用这个方法来处理消息。
方法接受三个参数:TaskInfoBo taskInfoBo(用于接收消息体中的信息,并自动转换为TaskInfoBo对象)、Message message(代表原始的RabbitMQ消息)和Channel channel(用于与RabbitMQ进行交互的通道)。
在方法体中,我们首先通过message对象获取消息的deliveryTag,这个deliveryTag用于后续的消息确认或拒绝操作。
然后,我们尝试执行一些业务逻辑代码。如果业务代码执行成功,我们使用channel.basicAck方法手动确认消息已被成功处理,从而从队列中移除该消息。如果业务代码执行过程中出现异常,我们使用channel.basicReject方法手动拒绝该消息,这里拒绝时不将消息重新放回队列(第二个参数为false)。
这种手动确认消息的方式确保了消息处理的可靠性和健壮性,只有当消息被成功处理后才从队列中移除,否则会被拒绝或重新尝试处理。

总结

完成上诉步骤我们完成了Spring Cloud 集成RabbitMQ。还有很多其他的模式,等到业务用到后再进行补充。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据静态脱敏技术广泛的应用价值

数据静态脱敏是一种重要的数据保护技术&#xff0c;其核心目标是在保证数据库系统正常运行的前提下&#xff0c;对敏感数据进行脱敏处理&#xff0c;从而降低数据泄露的风险。在数字化时代&#xff0c;数据成为企业最宝贵的资产之一&#xff0c;然而&#xff0c;数据的敏感性和…

每日一题(leetcode2009):使数组连续的最小操作数--滑动窗口

从相反面考虑&#xff0c;一条已知长度的线段最多能覆盖多少数值&#xff0c;最先用长度减一下就行。线段覆盖问题用滑动窗口就行。代码如下&#xff1a; class Solution { public:int minOperations(vector<int>& nums) {int lennums.size();sort(nums.begin(),num…

安全威胁情报的漏洞挖掘

前段时间edu上出现了两个网安总队收取安全情报&#xff0c;不收漏洞&#xff0c;下面简单分析一下如何挖掘安全情报。 在发现在edu中新增了两个网安总队收安全情报等漏洞&#xff0c;那威胁情报又会包含哪些内容呢&#xff1f;以前或许会看到各种ss网站、bc网站、yx网站满天飞&…

MySQL - 基于undo log多版本链条实现的ReadView机制到底是什么?

ReadView简单来说,就是你执行一个事务的时候,就给你生成一个ReadView,里面比较关键的东西有4个: 一个是m_ids,这个即使说此时有哪些事务在MySQL里执行还没提交的; 一个是min_trx_id,就是m_ids里最小的值; 一个是max_trx_id,就是说mysql下一个要生成的事务id,就是最大…

蓝桥杯DFS自练三题-串变换,玩具蛇,分糖果

题目一:串变换 代码解析: #include <iostream> using namespace std; struct Option{int select;int x;int y; }; string S,T; int N,K;//N是串的长度&#xff0c;K是操作指令的大小 Option opt[10];//存储所有的指令 bool vis[10];//标记数组&#xff0c;重要&#xff…

4.1-4.5算法刷题笔记(17道题)

4.1-4.5算法刷题笔记 1. 区间和2. 区间合并3. 用队列实现栈&#xff08;queueMain queueTemp;&#xff09;4. 最小栈 1. 单链表模板5. 单链表 2. 双链表模板6. 双链表 3. 模拟栈7. 模拟栈(一个数组即可)8. 表达式求值 4. 队列 tt -1,hh 0;9. 模拟队列 5. 单调栈10. 单调栈 6…

视觉大模型--DAB-deter的深入理解

原理大家参考这篇文章&#xff0c;我主要是根据自己的理解和整个流程图以及代码进行对应&#xff0c;这样更有利于深入理解&#xff1a; 下图是解码器结构图&#xff0c;编码器没动和deter一样的 这张图片基本上说清了模型的结构和传递过程&#xff0c;红色代表切断梯度反向传…

用TensorBoard可视化PyTorch

一、TensorBoard与PyTorch配合使用的基本步骤 PyTorch可以直接与TensorBoard进行集成&#xff0c;因为TensorBoard是一个独立于TensorFlow之外的可视化工具。TensorBoard被设计为支持机器学习实验的可视化&#xff0c;如训练的进度和结果等。PyTorch中的torch.utils.tensorboa…

SSM党员管理系统

一、系统介绍 党员管理系统: 可以方便管理人员对党员管理系统的管理&#xff0c;提高信息管理工作效率及查询效率&#xff0c;有利于更好的为用户提供服务。 主要的模块包括&#xff1a; 1、后台功能&#xff1a; 管理员角色&#xff1a;首页、个人中心&#xff0c;党员管理…

“成像光谱遥感技术中的AI革命:ChatGPT在遥感领域中的应用“

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能…

Vue-B站学习笔记

1. 路由配置 B站视频之Vue route文件下的index.js app.vue

云原生:5分钟了解一下Kubernetes是什么

在当今的云计算时代&#xff0c;容器化技术变得越来越重要。它能够帮助开发者更高效地部署和管理应用程序。而Kubernetes&#xff0c;作为容器编排领域的领军者&#xff0c;正逐渐成为企业构建和管理云原生应用的核心工具。 近期将持续为大家分享Kubernetes相关知识&#xff…

78、WAF攻防——菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知

文章目录 菜刀冰蝎哥斯拉 本节主要讲上传了后门&#xff0c;要是用webshell连接工具进行连接&#xff0c;而webshell连接工具特征可能被检测系统识别相关内容。 web防护软件&#xff1a; WEB应用防火墙——WAF入侵检测系统——IDS、HIDS威胁感知——天眼 感知威胁技术&#x…

基于单片机数码管20V电压表仿真设计

**单片机设计介绍&#xff0c;基于单片机数码管20V电压表仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机数码管20V电压表仿真设计的主要目的是通过单片机和数码管显示电路实现一个能够测量0到20V直流电压的电…

如何设计系统容量?

单位每年都会举行运动会&#xff0c;有一个2000m长跑的项目&#xff0c;大约每年报名人员为男选手40人&#xff0c;女选手20人&#xff0c;只有一条橡胶跑道。一次比赛10人齐跑&#xff0c;所以至少需要6场比赛。 2000米的完成时间要求是20分钟&#xff0c;超过20分钟不计数&a…

世强硬创获德佑威授权代理,拓展UV胶粘剂/PUR热熔胶等产品布局

随着下游应用市场产品不断更新迭代&#xff0c;以及企业的环保意识提高&#xff0c;企业对电子胶粘材料的性能要求越来越高&#xff0c;从而推动上游原厂的技术创新与升级&#xff0c;为国内提供更多高性能国产胶粘材料。 基于优良的口碑&#xff0c;世强先进&#xff08;深圳…

关于JVM-三色标记算法剖析

相关系列 深入理解JVM垃圾收集器-CSDN博客 深入理解JVM垃圾收集算法-CSDN博客 深入理解jvm执行引擎-CSDN博客 jvm优化原则-CSDN博客 jvm流程图-CSDN博客 三色标记产生的原因&#xff1f; 在并发标记的过程中&#xff0c;因为标记期间应用线程还在继续跑&#xff0c;对象间的引…

面试题:volatile

一旦一个共享变量&#xff08;类的成员变量、类的静态成员变量&#xff09;被volatile修饰之后&#xff0c;那么就具备了两层语义&#xff1a; 1. 保证线程间的可见性 保证了不同线程对这个变量进行操作时的可见性&#xff0c;即一个线程修改了某个变量的值&#xff0c;这新值…

Javascript进阶内容

1. 作用域 1.1 局部作用域 局部作用域分为函数作用域 和 块级作用域 块级作用域就是用 {} 包起来的&#xff0c;let、const声明的变量就是产生块作用域&#xff0c;var不会&#xff1b;不同代码块之间的变量无法互相访问&#xff0c;里面的变量外部无法访问 1.2 全局作用域…

安卓开机启动流程

目录 一、整体框架二、流程代码分析2.1 Boot ROM2.2 Boot Loader2.3 Kernel层Kernel代码部分 2.4 Init进程Init进程代码部分 2.5 zygote进程zygote代码部分 2.6 SystemServer进程SystemServer代码部分 2.7 启动Launcher与SystemUI 三、SystemServices3.1 引导服务3.2 核心服务3…