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。还有很多其他的模式,等到业务用到后再进行补充。


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

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

相关文章

ASP.NET公交车管理系统的实现与设计

摘 要 随着经济的日益增长&#xff0c;信息化时代已经到来&#xff0c;生活中各种信息趋向数字化、清晰化。公交车作为现代城市生活中一种重要的交通工具&#xff0c;其数量增多&#xff0c;车型也不再单一&#xff0c;雇用的司机增多&#xff0c;这样使得公交车公司的车辆信…

XTTS数据迁移方案

前置条件检查 XTTS使用限制较多&#xff0c;V3版本按照本节逐项检查 目标库操作系统不能是windows 源库&#xff1a;redhut 7.9 目标库&#xff1a;redhut 7.9 检查数据库时区&#xff08;两边都需要&#xff09; SQL> select dbtimezone from dual; 检查结果两边都一致…

系统架构设计与优化的几个关键点

1. 业务理解与需求分析 业务场景梳理&#xff1a;深入理解业务流程、业务规则、用户行为模式等&#xff0c;明确系统需要支持的核心功能和应用场景。非功能性需求识别&#xff1a;关注性能指标&#xff08;如响应时间、并发处理能力、数据吞吐量等&#xff09;、可用性要求&am…

机器学习和深度学习--李宏毅 (笔记与个人理解)Day 16

Day 16 deep Learning – 鱼与熊掌兼得 最近在减重&#xff0c; 昨天跑了个一公里&#xff0c;然后今天上午又打了个篮球&#xff0c;真是老胳膊老腿了&#xff0c;运动完给我困得不行 Review 见前面的笔记 这里说dl 会提供一个足够大的模型&#xff0c; 来使得Dall loss 足够小…

创业之路:从市场洞察到产品实现的全方位指南

创业是一项挑战性的旅程&#xff0c;需要综合考虑市场、产品、技术、团队等多个方面。在这篇文章中&#xff0c;我们将深入探讨如何更好地进行创业&#xff0c;从市场分析到产品实现的各个环节。 深入市场洞察 在创业之前&#xff0c;深入了解目标市场是至关重要的。我们需要…

Unity类银河恶魔城学习记录12-14 p136 Merge Skill Tree with Sword skill源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili CharacterStats.cs using System.Collections; using System.Collections.…

如何在CentOS中开放指定端口

本文将介绍在CentOS中如何通过firewalld和iptables开放指定端口。 一. firewalld 在CentOS系统中&#xff0c;firewalld是一个动态管理防火墙的守护进程&#xff0c;它提供了一个更加灵活和强大的防火墙管理工具。 以下是在CentOS 7和CentOS 8中使用firewalld开放指定端口的…

【Ubuntu】在 Windows 和 Ubuntu 之间传输文件

在 Ubuntu 上安装 Samba&#xff1a; sudo apt-get update sudo apt-get install samba在 Ubuntu 上创建一个共享文件夹并设置权限&#xff1a; mkdir /home/your_username/shared sudo chown nobody:nogroup /home/your_username/shared sudo chmod 0777 /home/your_username/…

【氮化镓】GaN HEMTs结温和热阻测试方法

文章《Temperature rise detection in GaN high-electron-mobility transistors via gate-drain Schottky junction forward-conduction voltages》&#xff0c;由Xiujuan Huang, Chunsheng Guo, Qian Wen, Shiwei Feng, 和 Yamin Zhang撰写&#xff0c;发表在《Microelectroni…

绿联HDMI延长器40265使用AG7120芯片放大器方案

HDMI延长器和放大器 延长器&#xff1a;主要用于HDMI线的延长&#xff0c;有HDMI对接头方式延长&#xff0c;或HDMI公头加HDMI母头的HDMI线进行延长&#xff0c;或通过网线方式延长&#xff0c;早期为双网线&#xff0c;目前已发展为单网线&#xff0c;需要注意的是&#xff0…

NLP_知识图谱_图谱问答实战

文章目录 图谱问答NERac自动机实体链接实体消歧 多跳问答neo4j_graph执行流程结构图![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1577c1d9c9e342b3acbf79824aae980f.png)company_data![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/20f567d877c743b…

前后端AES对称加密 前端TS 后端Go

注意点 前后端的秘钥和偏移量IV都必须是16/24/32字节&#xff0c;且需要保持一致。 后端 func (receiver *basicUtils) AesDecrypt(str string) string {// 将加密字符串转换为字节数组encryptedData, _ : base64.StdEncoding.DecodeString(str)// 创建一个新的AES解密器key…

【core analyzer】core analyzer的介绍和安装详情

目录 &#x1f31e;1. core和core analyzer的基本概念 &#x1f33c;1.1 coredump文件 &#x1f33c;1.2 core analyzer &#x1f31e;2. core analyzer的安装详细过程 &#x1f33c;2.1 方式一 简单但不推荐 &#x1f33c;2.2 方式二 推荐 &#x1f33b;2.2.1 安装遇到…

TCP/IP 协议栈在 Linux 内核中的 运行时序分析

1、Linux内核概述 1.1 Linux内核结构 一个完整的Linux内核一般由5部分组成&#xff0c;它们分别是内存管理、进程管理、进程间通信、bai虚拟文件系统和网络接口。 1、内存管理 内存管理主要完成的是如何合理有效地管理整个系统的物理内存&#xff0c;同时快速响应内核各个子…

数据可视化基础与应用-04-seaborn库人口普查分析--如何做人口年龄层结构金字塔

总结 本系列是数据可视化基础与应用的第04篇seaborn&#xff0c;是seaborn从入门到精通系列第3篇。本系列主要介绍基于seaborn实现数据可视化。 参考 参考:我分享了一个项目给你《seaborn篇人口普查分析–如何做人口年龄层结构金字塔》&#xff0c;快来看看吧 数据集地址 h…

B3647 【模板】Floyd

【模板】Floyd 题目描述 给出一张由 n n n 个点 m m m 条边组成的无向图。 求出所有点对 ( i , j ) (i,j) (i,j) 之间的最短路径。 输入格式 第一行为两个整数 n , m n,m n,m&#xff0c;分别代表点的个数和边的条数。 接下来 m m m 行&#xff0c;每行三个整数 u …

dalle2介绍

dalle2是一个基于强化学习的图像生成模型&#xff0c;是dalle模型的改进版本。它由OpenAI团队开发&#xff0c;旨在生成高质量的、多样化的图像。 dalle2的核心思想是利用强化学习将图像生成过程转化为一个马尔可夫决策过程。它采用了一个称为"敌对生成网络"&#x…

7 种实现 CSS 三角形的原理与方法 以及 三角形在网页设计中的作用

三角形在网页设计中不仅是图形设计的基本元素&#xff0c;更是实现视觉引导、空间构建、情绪传达、品牌塑造、性能优化以及创新表达的重要工具。其广泛应用和多功能性使其成为设计师手中不可或缺的设计语言组成部分。本文介绍了7种CSS实现三角形的方法。 CSS实现三角形主要有以…

Gin中间件函数原理

在Gin框架中&#xff0c;Context.Next() 方法是中间件处理的核心&#xff0c;它控制着请求处理链&#xff08;HandlersChain&#xff09;中的执行流。下面是对这个函数及相关概念的详细解释&#xff1a; func (c *Context) Next() 这个方法定义在 Context 结构体上&#xff0c…

MYSQL执行过程和顺序详解

一、前言 1.1、说明 就MySQL在执行过程、sql执行顺序&#xff0c;以及一些相关关键字的注意点方面的学习分享内容。 在参考文章的基础上&#xff0c;会增加自己的理解、看法&#xff0c;希望本文章能够在您的学习中提供帮助。 如有错误的地方&#xff0c;欢迎指出纠错&…