在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 及其绑定关系 的方式:

方式适用场景特点
生产者手动声明多服务协作、复杂路由控制精细,结构清晰
消费者注解绑定快速开发、轻量级项目开发效率高,但仅限于消费者端

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

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

相关文章

IDC智能机房整体解决方案

该文档为 IDC 智能机房整体解决方案,目标是实现机房智能化、可视化、远程化管理,提升运维效率与客户服务能力。方案涵盖物理安全智能化(智能电子锁,支持远程控制、权限管理及离线 / 在线授权,兼容 1-3mm 门板厚度等)、监控智能化(人员定位、摄像头、机柜温湿度监控、能耗…

Kafka入门-集群基础环境搭建(JDK/Hadoop 部署 + 虚拟机配置 + SSH 免密+Kafka安装启动)

Kafka 简介 传统定义:Kafka是一个分布式的基于发布/订阅模式的消息队列,应用于大数据实时处理领域。 Kafka最新定义:Apache Kafka是一个开源分布式事件流平台,被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用…

【仿生机器人】建模—— 图生3D 的几个办法

两件事! 第一件: 强如 Gemini,在多模态和三维空间的理解中,如果不微调去做下游应用,直接 Zero-shot 的 效果是很差的 好处是有多视角图生3D,效果还可以,但是也没有很精细,&#xf…

简约商务通用宣传年终总结12套PPT模版分享

IOS风格企业宣传PPT模版,年终工作总结PPT模版,简约精致扁平化商务通用动画PPT模版,素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df

modelscope下载gguf格式模型

modelscope下载gguf格式模型 ollama加载模型 模型地址 https://www.modelscope.cn/models/okwinds/CompassJudger-1-7B-Instruct-GGUF-V3-LOT pip install modelscope modelscope download --modelokwinds/CompassJudger-1-7B-Instruct-GGUF-V3-LOT --include "CompassJ…

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…

解决Excel词典(xllex.dll)文件丢失或损坏问题的终极指南:从基础到高级修复技巧

在日常使用Microsoft Excel的过程中&#xff0c;许多用户可能会遇到一个令人沮丧的问题&#xff1a;Excel词典文件xllex.dll丢失或损坏。这不仅会影响到Excel的正常功能&#xff0c;还可能导致数据处理效率的降低。在这篇文章中&#xff0c;我们将深入探讨这一问题的原因&#…

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…

第11篇:数据库中间件系统可配置化设计与动态规则加载机制

11.1 引言&#xff1a;为什么需要可配置化&#xff1f; 数据库中间件在企业级环境中往往需要支持多租户、多业务场景、多数据库后端&#xff0c;因此固定逻辑会迅速过时或僵化。 为了提升 灵活性、可扩展性、部署效率&#xff0c;中间件系统亟需实现&#xff1a; ✅ 高度可配置…

C++信号处理程序解析与改进

这个程序演示了如何使用sigaction来捕获和处理信号&#xff08;特别是SIGINT&#xff0c;即CtrlC&#xff09;。以下是关键点和潜在问题的分析&#xff1a; 程序功能 信号捕获&#xff1a;注册自定义处理函数handler来捕获信号2&#xff08;SIGINT&#xff0c;通常由CtrlC触发…

Go爬虫开发学习记录

Go爬虫开发学习记录 基础篇&#xff1a;使用net/http库 Go的标准库net/http提供了完善的HTTP客户端功能&#xff0c;是构建爬虫的基石&#xff1a; package mainimport ("fmt""io""net/http" )func fetchPage(url string) string {// 创建自定…

ubuntu 系统分区注意事项

ubuntu 系统分区大小&#xff0c;注意事项&#xff1a; 安装ubuntu系统时&#xff0c;需要进行分区&#xff0c;手动分区时&#xff0c;有一点需要注意。一开始我也没有注意&#xff0c;长时间使用后才发现的问题。 需要注意一点&#xff0c;如果不对 /usr 进行单独分区&…

AI知识库调用全攻略:四种实战方法与技术实现

本文详细解析AI如何调用知识库解决实际问题&#xff0c;涵盖四种核心调用方式&#xff08;直接检索匹配、向量检索生成、工具调用知识库、多轮对话知识库&#xff09;&#xff0c;附具体业务样例与技术实现步骤&#xff0c;最后总结常见问题解决方案&#xff0c;助你快速搭建智…

WebRTC(一):整体架构

架构总览 模块划分 媒体采集模块 使用浏览器 API&#xff1a;getUserMedia()。采集摄像头&#xff08;video&#xff09;、麦克风&#xff08;audio&#xff09;。通过 MediaStreamTrack 管理单轨道。 媒体处理与编解码 编码器&#xff08;发送端&#xff09;&#xff1a; …

商品中心—1.B端建品和C端缓存的技术文档二

大纲 1.商品中心的专业术语 2.商品中心的基本业务系统 3.商品中心整体架构设计以及运行流程 4.商品B端—商品编码生成逻辑 5.商品B端—商品核心数据模型 6.商品B端—转换建品请求数据为商品模型数据 7.商品B端—商品建品时商品编号补全与审核配置 8.商品B端—商品审核前…

网络之交换机

定义与作用 交换机是一种为所连接的IT设备提供网络通信的设备&#xff0c;主要作用是转发传输数据&#xff0c;实现网络设备之间的通信互联&#xff0c;还能对网络进行分段和隔离&#xff0c;划分多个虚拟网段&#xff0c;提高网络安全性&#xff0c;以及对不同端口、用户和应用…

AI不会杀死创作,但会杀死平庸

作为一个敲了8年Java代码的普通本科程序员&#xff0c;日常主要泡在会议后台管理系统的开发里。从2023年底被朋友拽着试了第一把AI工具到现在&#xff0c;电脑手机上的AI软件比外卖App还多——写代码的Copilot、画时序图的工具、聊天的ChatGPT、Deepseek&#xff0c;基本市面上…

Golang——8、协程和管道

协程和管道 1、协程1.1、进程、线程和协程1.2、goroutine的使用以及sync.WaitGroup1.3、启动多个协程1.4、设置Golang并行运行的时候占用的cup数量1.5、goroutine统计素数 2、管道2.1、管道的操作2.2、协程和管道协同2.3、单向管道2.4、多路复用之select2.5、解决协程中出现的异…

深入理解Python内置模块及第三方库的使用与管理

Python 内置模块与第三方库 在 Python 编程中&#xff0c;模块和库是帮助开发者高效实现各种功能的基础工具。Python 提供了丰富的内置模块以及第三方库&#xff0c;能够支持从基础的文件操作到复杂的数据分析和机器学习等任务。本篇文章将深入介绍 Python 的内置模块与第三方…

二分查找-P2249 【深基13.例1】查找

文章目录 参考代码二分标准模板 题目来源-洛谷网 参考代码 #include<bits/stdc.h> using namespace std; const int N 1e65; int m,n,a[N],b; int find(int t) {int l1,rn;while(l<r){int mid(lr)/2;//防止溢出 mid l (r-l) /2 ;if(a[mid]>t) rmid;//中间值比…