在Spring Boot中集成RabbitMQ的完整指南
前言
在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。
本博客将详细介绍如何在 Spring Boot 项目中集成 RabbitMQ,包括配置、发送和接收消息的基本流程,并介绍如何通过 两种方式定义交换机(Exchange)与队列(Queue):一种是在生产者端手动声明,另一种是在消费者端通过注解自动绑定。
准备工作
1. 安装 RabbitMQ
可以通过 Docker 快速安装 RabbitMQ:
docker run -d --hostname my-rabbit --name rabbitmq \-p 5672:5672 -p 15672:15672 \rabbitmq:3-management
5672
:AMQP 协议端口15672
:RabbitMQ 管理界面端口
访问管理界面:http://localhost:15672
默认账号密码:guest / guest
2. 消息发送者(Producer)配置
1. 创建 Spring Boot 项目
使用 Spring Initializr 或 IDE 的新建项目向导来创建一个新的 Spring Boot 项目,确保添加以下依赖:
- Spring Web
- Spring AMQP
2. 配置 RabbitMQ 连接信息
在 application.yml
中配置 RabbitMQ 的连接参数:
spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest
3. 编写消息发送逻辑
创建一个简单的 REST 控制器来触发消息发送:
@RestController
@RequestMapping("/api/producer")
public class ProducerController {@Autowiredprivate AmqpTemplate amqpTemplate;@GetMapping("/send")public String sendMessage(@RequestParam String message) {amqpTemplate.convertAndSend("my.queue", message);return "Message sent: " + message;}
}
✅ 注意:这种方式适用于直接发送到队列的情况,但在实际项目中我们通常会通过 Exchange 来路由消息。
3. 使用 Exchange 的两种方式
在 RabbitMQ 中,消息的流向是:Producer → Exchange → Queue → Consumer。因此,定义 Exchange 和 Queue 并进行绑定是非常关键的步骤。
下面介绍两种常见的定义方式:
方式一:在生产者端手动声明 Exchange、Queue 和 Binding
示例:Direct Exchange
1. 配置类定义 Exchange、Queue 及其绑定关系
@Configuration
public class RabbitMQConfig {@Beanpublic DirectExchange myDirectExchange() {return new DirectExchange("my.direct.exchange");}@Beanpublic Queue myDirectQueue() {return new Queue("my.direct.queue");}@Beanpublic Binding bindingDirectQueueToExchange(Queue myDirectQueue, DirectExchange myDirectExchange) {return BindingBuilderSupport.bind(myDirectQueue).to(myDirectExchange).with("direct.key").noargs();}
}
2. 发送消息时指定 Exchange 和 Routing Key
amqpTemplate.convertAndSend("my.direct.exchange", "direct.key", message);
这种方式适合需要精细控制队列和交换机的场景,如多服务协同、复杂路由等。
方式二:在消费者端通过注解自动声明 Exchange、Queue 并绑定
Spring 提供了强大的注解功能,可以在消费者监听方法上直接声明 Exchange、Queue 和绑定关系,无需额外的配置类。
示例:使用 @RabbitListener
注解绑定
@Component
public class ConsumerListener {@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "my.annotation.queue", durable = "true"),exchange = @Exchange(value = "my.annotation.exchange", type = "direct", durable = "true"),key = "annotation.key"))public void receive(String message) {System.out.println("【消费者】收到消息:" + message);}
}
优点:开发更高效,特别适合快速搭建原型或小型项目。
注意事项:
- 此方式只在消费者端有效;
- 如果已有 Exchange 或 Queue 与注解配置不一致,可能会抛出异常;
- 建议设置
durable = "true"
实现持久化。
4. 消息消费者(Consumer)配置
1. 创建 Spring Boot 项目
同样地,创建一个新的 Spring Boot 项目,这次只需要添加 Spring AMQP 依赖。
2. 配置 RabbitMQ 连接信息
与生产者的配置相同,在 application.yml
中配置 RabbitMQ 的连接参数。
3. 创建队列并编写消息接收逻辑
方法一:手动定义队列(推荐用于简单场景)
@Configuration
public class RabbitMQConfig {@Beanpublic Queue myQueue() {return new Queue("my.queue");}
}
方法二:使用 @RabbitListener
自动绑定(详见上文)
消息监听器
@Component
public class ConsumerListener {@RabbitListener(queues = "my.queue")public void receive(String message) {System.out.println("Received message: " + message);}
}
注意事项
- 队列名称一致性:确保生产者和消费者的队列名称一致,这样它们才能正确通信。
- 网络连通性:如果生产者和消费者运行在不同的机器上,请确保这些机器之间能够通过网络访问 RabbitMQ 服务器,并根据需要调整主机名或 IP 地址。
- 并发处理:考虑在消费者端配置并发消费者以提高消息处理效率。
- 幂等性与容错机制:建议开启确认机制(ACK/NACK),避免消息丢失或重复消费。
总结
通过以上步骤,我们就可以拥有两个独立的 Spring Boot 应用程序:一个用于发送消息,另一个用于消费消息。这种方式非常适合构建基于消息队列的分布式系统。
同时,也了解了两种定义 Exchange、Queue 及其绑定关系 的方式:
方式 | 适用场景 | 特点 |
---|---|---|
生产者手动声明 | 多服务协作、复杂路由 | 控制精细,结构清晰 |
消费者注解绑定 | 快速开发、轻量级项目 | 开发效率高,但仅限于消费者端 |
相关文章:
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...

Element-Plus:popconfirm与tooltip一起使用不生效?
你们好,我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip,产品要求是两个需要结合一起使用,也就是鼠标悬浮上去有提示文字,并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...

Selenium 查找页面元素的方式
Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素,以下是主要的定位方式: 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…...

OPENCV图形计算面积、弧长API讲解(1)
一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积,这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能,常用的API…...
【Java】Ajax 技术详解
文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...

spring boot使用HttpServletResponse实现sse后端流式输出消息
1.以前只是看过SSE的相关文章,没有具体实践,这次接入AI大模型使用到了流式输出,涉及到给前端流式返回,所以记录一下。 2.resp要设置为text/event-stream resp.setContentType("text/event-stream"); resp.setCharacter…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...
无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技
无需布线的革命:电力载波技术赋能楼宇自控系统 在楼宇自动化领域,传统控制系统依赖复杂的专用通信线路,不仅施工成本高昂,后期维护和扩展也极为不便。电力载波技术(PLC)的突破性应用,彻底改变了…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.
这个警告表明您在使用Vue的esm-bundler构建版本时,未明确定义编译时特性标志。以下是详细解释和解决方案: 问题原因: 该标志是Vue 3.4引入的编译时特性标志,用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...

【技巧】dify前端源代码修改第一弹-增加tab页
回到目录 【技巧】dify前端源代码修改第一弹-增加tab页 尝试修改dify的前端源代码,在知识库增加一个tab页"HELLO WORLD",完成后的效果如下 [gif01] 1. 前端代码进入调试模式 参考 【部署】win10的wsl环境下启动dify的web前端服务 启动调试…...

Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...
比特币:固若金汤的数字堡垒与它的四道防线
第一道防线:机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”(Hashing)就是一种军事级的加密术(SHA-256),能将信函内容(交易细节…...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)
零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...
接口 RESTful 中的超媒体:REST 架构的灵魂驱动
在 RESTful 架构中,** 超媒体(Hypermedia)** 是一个核心概念,它体现了 REST 的 “表述性状态转移(Representational State Transfer)” 的本质,也是区分 “真 RESTful API” 与 “伪 RESTful AP…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...

云原生时代的系统设计:架构转型的战略支点
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、云原生的崛起:技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深,传统的 I…...
Git 命令全流程总结
以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结,按操作场景分类整理: 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...

python可视化:俄乌战争时间线关键节点与深层原因
俄乌战争时间线可视化分析:关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一,自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具,系统分析这场战争的时间线、关键节点及其背后的深层原因,全面…...

C# WPF 左右布局实现学习笔记(1)
开发流程视频: https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码: GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用(.NET Framework) 2.…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...

【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...
使用python进行图像处理—图像滤波(5)
图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...

npm安装electron下载太慢,导致报错
npm安装electron下载太慢,导致报错 背景 想学习electron框架做个桌面应用,卡在了安装依赖(无语了)。。。一开始以为node版本或者npm版本太低问题,调整版本后还是报错。偶尔执行install命令后,可以开始下载…...

职坐标物联网全栈开发全流程解析
物联网全栈开发涵盖从物理设备到上层应用的完整技术链路,其核心流程可归纳为四大模块:感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性,例如传感器选型需平衡精度与…...
6.9本日总结
一、英语 复习默写list11list18,订正07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语:复习l默写sit12list17&#…...
RLHF vs RLVR:对齐学习中的两种强化方式详解
在语言模型对齐(alignment)中,强化学习(RL)是一种重要的策略。而其中两种典型形式——RLHF(Reinforcement Learning with Human Feedback) 与 RLVR(Reinforcement Learning with Ver…...
OpenGL-什么是软OpenGL/软渲染/软光栅?
软OpenGL(Software OpenGL)或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项
一、条形码识别改名使用教程 打开软件并选择处理模式:打开软件后,根据要处理的文件类型,选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件,就选择 “PDF 识别模式”;若是处理图片文件&…...