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

深入浅出 RabbitMQ - SpringBoot2.X整合RabbitMQ实战

大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注
实战代码系列最新文章😉C++实现图书管理系统(Qt C++ GUI界面版)
SpringBoot实战系列🐷【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案
分库分表分库分表之实战-sharding-JDBC分库分表执行流程原理剖析
消息队列深入浅出 RabbitMQ - 主题模式(Topic)

前情摘要:

1、深入浅出 RabbitMQ-核心概念介绍与容器化部署
2、深入浅出 RabbitMQ-简单队列实战
3、深入浅出 RabbitMQ-工作队列实战(轮训策略VS公平策略)
4、深入浅出 RabbitMQ-交换机详解与发布订阅模型实战
4、深入浅出 RabbitMQ-路由模式详解
5、深入浅出 RabbitMQ - 主题模式(Topic)

本文章目录

  • 深入浅出 RabbitMQ - SpringBoot2.X整合RabbitMQ实战
    • 一、环境准备
    • 二、配置RabbitMQ连接
      • 核心配置(application.yml)
    • 三、定义消息队列核心组件
      • RabbitMQConfig配置类
    • 四、实现消息生产者
      • 消息生产者(测试类)
    • 五、实现消息消费者
      • 消息消费者
    • 六、测试验证
    • 七、注意事项
    • 总结

深入浅出 RabbitMQ - SpringBoot2.X整合RabbitMQ实战

一、环境准备

  1. 安装RabbitMQ
    首先确保已安装RabbitMQ服务并启动,可通过官方镜像或包管理工具安装。可参见深入浅出 RabbitMQ-核心概念介绍与容器化部署。

  2. 项目依赖
    在SpringBoot项目的pom.xml中添加RabbitMQ Starter依赖:

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

二、配置RabbitMQ连接

SpringBoot通过yml配置文件自动注入RabbitMQ连接信息,无需手动创建连接工厂。

核心配置(application.yml)

spring:rabbitmq:host: 192.168.229.128  # RabbitMQ服务器地址port: 5672          # 通信端口(默认5672)virtual-host: /dev  # 虚拟主机(隔离不同环境的消息资源)username: admin     # 登录用户名password: password  # 登录密码

配置说明

  • virtual-host用于隔离不同项目的消息,避免命名冲突;
  • 若使用默认配置,可省略port(默认5672)和virtual-host(默认/)。

三、定义消息队列核心组件

通过配置类定义交换机(Exchange)、队列(Queue)及绑定关系(Binding),这是RabbitMQ消息路由的核心。

RabbitMQConfig配置类

@Configuration
public class RabbitMQConfig {// 交换机名称public static final String EXCHANGE_NAME = "order_exchange";// 队列名称public static final String QUEUE_NAME = "order_queue";/*** 声明主题交换机(Topic Exchange)* 特点:按路由键模式匹配消息,支持通配符(*匹配一个词,#匹配多个词)*/@Beanpublic Exchange orderExchange() {// durable(true):交换机持久化(服务重启后不丢失)return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();}/*** 声明持久化队列*/@Beanpublic Queue orderQueue() {// durable(true):队列持久化(服务重启后队列仍存在)return QueueBuilder.durable(QUEUE_NAME).build();}/*** 绑定交换机与队列* 路由键规则:order.#(匹配以order.开头的所有路由键,如order.new、order.pay等)*/@Beanpublic Binding orderBinding(Queue queue, Exchange exchange) {return BindingBuilder.bind(queue).to(exchange).with("order.#").noargs();}
}

核心概念解析

  • 交换机:接收生产者发送的消息,根据规则路由到队列;这里使用Topic类型,灵活性更高;
  • 队列:存储消息的容器,必须与交换机绑定才能接收消息;
  • 绑定关系:通过路由键(Routing Key)定义交换机到队列的映射规则,决定消息流向。

四、实现消息生产者

使用RabbitTemplate发送消息到指定交换机,SpringBoot已自动配置该组件,可直接注入使用。

消息生产者(测试类)

@SpringBootTest
class DemoApplicationTests {@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 发送消息测试*/@Testvoid sendMessage() {// 参数1:交换机名称(从配置类引用,避免硬编码)// 参数2:路由键(需符合绑定规则order.#)// 参数3:消息内容(支持String、对象等类型)rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"order.new","新订单来啦1");System.out.println("消息发送成功");}
}

发送逻辑说明

  • 路由键order.new符合绑定规则order.#,消息会被路由到order_queue
  • 若路由键不符合规则(如user.new),消息将被丢弃(除非配置了死信交换机);
  • 消息内容支持序列化对象,需确保对象实现Serializable接口。

五、实现消息消费者

通过@RabbitListener注解监听指定队列,自动接收并处理消息。

消息消费者

@Component
public class OrderMQListener {/*** 监听order_queue队列的消息* @param msg 消息内容(自动转换为String类型)* @param message 消息完整对象(包含属性、路由键等元数据)*/@RabbitListener(queues = RabbitMQConfig.QUEUE_NAME)  // 绑定监听的队列@RabbitHandler  // 处理消息的具体方法public void handleOrderMessage(String msg, Message message) {// 获取消息投递标签(用于手动确认消息)long deliveryTag = message.getMessageProperties().getDeliveryTag();// 打印消息详情System.out.println("===== 接收到消息 =====");System.out.println("消息标签:" + deliveryTag);System.out.println("消息内容:" + msg);System.out.println("消息元数据:" + message.getMessageProperties());}
}

消费逻辑说明

  • @RabbitListener:指定监听的队列,支持同时监听多个队列;
  • @RabbitHandler:标记消息处理方法,支持根据消息类型重载;
  • 消息确认:默认开启自动确认(消息接收后自动从队列删除),如需手动确认,可配置acknowledge-mode: manual

六、测试验证

  1. 启动服务:启动SpringBoot应用,消费者会自动注册到RabbitMQ;
  2. 发送消息:运行测试类的sendMessage方法,发送测试消息;
  3. 查看结果:控制台输出如下,说明消息发送和接收成功:
    在这里插入图片描述

七、注意事项

  1. 持久化配置:交换机和队列需设置durable(true),避免服务重启后组件丢失;
  2. 路由键匹配:Topic交换机的路由键需符合*#的通配规则,否则消息无法路由;
  3. 消息序列化:默认使用JDK序列化,建议配置JSON序列化器(如Jackson2JsonMessageConverter);
  4. 异常处理:消费者需添加异常处理逻辑,避免消息处理失败导致无限重试。

总结

本文通过实战案例演示了SpringBoot2.X整合RabbitMQ的核心步骤,从配置连接、定义组件到实现消息的生产与消费。关键在于理解交换机、队列、路由键的协作关系,以及SpringBoot自动配置带来的简化。后续可进一步学习消息确认机制、死信队列、延迟消息等高级特性,提升消息队列的可靠性。

觉得有用请点赞收藏!
如果有相关问题,欢迎评论区留言讨论~

http://www.dtcms.com/a/362725.html

相关文章:

  • 23种设计模式-抽象工厂模式
  • 蓝桥杯算法之基础知识(4)
  • Mysql杂志(七)
  • Deepin25安装mysql8.4.5
  • 在ROS中获取并发布UBS式传感器的温湿度
  • PostgreSQL(1) FETCH用法
  • 企业数字安全守护神:IT运维管理系统全面解析,构建坚不可摧的防护体系
  • 简陋的RPC
  • 从代码到组件:C语言动态库(DLL)封装与使用终极指南
  • NV115NV119美光固态闪存NV129NV112
  • 加速交通云建设,移动云为我国交通强国目标提供有力支撑
  • AES-GCM和(AES-CBC+SHA2-25-HAMC组合,并且发方通过每次内容,更新iv,填序使用递增数字)算法比较
  • 系统科学核心概念辨析及其在人工智能领域的应用研究:一个整合性分析框架
  • 分布式光纤传感选型 3 问:你的场景该选 DTS、DAS 还是 BOTDA?
  • 解锁WebRTC在数字人领域的无限潜能
  • 面试问题:c++的内存管理方式,delete的使用,vector的resize和reverse,容量拓展
  • 大数据量模块设置渲染性能优化
  • 白电三巨头 2025 年战局:美的领跑破局,海尔稳健筑垒,格力承压求变
  • Spring 中 Hikari 与 Druid 的详细介绍、对比及同类组件分析
  • go-mapus最简单的离线瓦片地图协作
  • 【Linux系统】万字解析,进程间的信号
  • 并发编程——13 线程池ThreadPoolExecutor实战及其原理分析
  • md5sum -c用法详解
  • 【Vue2 ✨】Vue2 入门之旅(八):过渡与动画
  • 基础文本处理工具与文本三剑客其二sed awk
  • unity 中的 gradle building 加速(可能无用,导致包体异常)
  • 【C++详解】C++11(三) 可变参数模板、包扩展、empalce系列接⼝、新的类功能
  • MyBatis:让 SQL 与代码和谐共处的持久层框架
  • React学习教程,从入门到精通, React 入门指南:React JSX 语法知识点详解及案例代码(8)
  • React 学习笔记4 Diffing/脚手架