news 2026/9/30 16:31:45

Java-211 Spring Boot 2.4.1 整合 RabbitMQ 实战:DirectExchange + @RabbitListener 全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java-211 Spring Boot 2.4.1 整合 RabbitMQ 实战:DirectExchange + @RabbitListener 全流程

TL;DR

  • 场景:Spring Boot 快速接入 RabbitMQ,实现 HTTP 触发投递、消费者监听消费。
  • 结论:用 Spring AMQP 声明拓扑(Queue/DirectExchange/Binding)+ AmqpTemplate 投递 + @RabbitListener 消费即可闭环。
  • 产出:可复用的最小可跑 Demo(POM + yml + 配置类 + Controller + Consumer)。

版本矩阵

项目说明
Spring Boot 2.4.1spring-boot-starter-parent 版本固定为 2.4.1(你 POM 中写死)。
Java 8maven.compiler.source/target=8。
spring-boot-starter-amqp引入 Spring AMQP / Spring Rabbit,提供 AmqpTemplate、@RabbitListener 等。
RabbitMQ Server(版本未标注)你的配置仅依赖 AMQP 基础能力(Direct/Queue/Binding),通常跨版本兼容;但未提供服务端版本号,无法给出“已验证”结论。
Spring Web(starter-web)用于暴露 /send/{message} 测试入口。

Spring Boot 整合 RabbitMQ

基本介绍

Spring AMQP 是 Spring 框架对 AMQP (Advanced Message Queuing Protocol) 协议的抽象实现,它提供了统一的编程模型来操作 AMQP。而 Spring Rabbit 是 Spring AMQP 的具体实现,专门针对 RabbitMQ 消息中间件进行了封装和扩展。

PS:续接上节的内容
PS:续接上节的内容
PS:续接上节的内容

POM

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>icu.wzk</groupId><artifactId>rabbitmq-springboot</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.1</version><relativePath/></parent><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>

application.yml

spring:application:name:rabbit-mqrabbitmq:host:localhostport:5672username:adminpassword:secretvirtual-host:/

StartApp

packageicu.wzk;@SpringBootApplicationpublicclassStartApp{publicstaticvoidmain(String[]args){SpringApplication.run(StartApp.class,args);}}

RabbitConfig

packageicu.wzk.config;/** * RabbitMQ 拓扑声明: * - Queue: myqueue * - Exchange: myex(direct) * - Binding: myqueue <- myex,routingKey = direct.biz.ex * * 说明: * 1) durable=true:broker 重启后依然存在(生产环境默认应为 true) * 2) autoDelete=false:没有消费者也不自动删除 * 3) 这里用 DirectExchange,路由规则是 routingKey 精确匹配 */@ConfigurationpublicclassRabbitConfig{publicstaticfinalStringQUEUE="myqueue";publicstaticfinalStringEXCHANGE="myex";publicstaticfinalStringROUTING_KEY="direct.biz.ex";/** * 队列:持久化队列 */@BeanpublicQueuemyQueue(){returnnewQueue(QUEUE,true,false,false);}/** * 交换机:DirectExchange(精确路由) */@BeanpublicExchangemyExchange(){returnnewDirectExchange(EXCHANGE,true,false);}/** * 绑定:把队列绑定到交换机,并指定 routingKey * * 推荐写法:用 BindingBuilder,避免手写 Binding 构造参数时填错。 */@BeanpublicBindingmyBinding(QueuemyQueue,DirectExchangemyExchange){returnorg.springframework.amqp.core.BindingBuilder.bind(myQueue).to(myExchange).with(ROUTING_KEY);}/* * 其它 Exchange 的等价写法(按需替换 myExchange()): * * TopicExchange: * return new TopicExchange("topic.biz.ex", true, false); * * FanoutExchange: * return new FanoutExchange("fanout.biz.ex", true, false); * * HeadersExchange: * return new HeadersExchange("header.biz.ex", true, false); * * CustomExchange: * return new CustomExchange("custom.biz.ex", ExchangeTypes.DIRECT, true, false, null); */}

HelloController

packageicu.wzk.controlle;@RestControllerpublicclassHelloController{@AutowiredprivateAmqpTemplaterabbitTemplate;@RequestMapping("/send/{message}")publicStringsendMessage(@PathVariableStringmessage){rabbitTemplate.convertAndSend("myex","direct.biz.ex",message);return"ok";}}

HelloConsumer

使用监听器,用于推消息

packageicu.wzk.consumer;@ComponentpublicclassHelloConsumer{@RabbitListener(queues="myqueue")publicvoidservice(Stringmessage){System.out.println("消息队列推送来的消息:"+message);}}

运行测试

启动后可以看到刚才测试中的数据已经消费到了:

错误速查

症状根因定位修复
启动报错:Parameter 2 of method myBinding required a bean of type ‘DirectExchange’ that could not be foundmyExchange() 返回类型写成 Exchange,而 myBinding 形参要求 DirectExchange,Spring 无法按类型注入看启动日志的 Bean 注入异常;检查 RabbitConfig 中 myExchange() 方法签名把 myExchange() 返回类型改为 DirectExchange;或把 myBinding 形参改为 Exchange 并在内部强转/改写绑定方式
发送成功但队列无消息/消费者无输出exchange/routingKey/queue/binding 任一不一致(拼写、大小写、routingKey 不匹配)RabbitMQ Management UI:Exchanges/Queues/Bindings;或用日志打印实际投递参数统一常量引用:Controller 使用 RabbitConfig.EXCHANGE/ROUTING_KEY;确保 binding routingKey = 投递 routingKey
请求 /send/{message} 404Controller 包名拼写错误:icu.wzk.controlle 少了 r,导致组件扫描失败看启动日志是否有映射;检查项目结构与包名修正包名为 icu.wzk.controller;或确保 @SpringBootApplication 扫描到该包
启动时报 ACCESS_REFUSED - Login was refused用户名/密码/virtual-host 不正确,或该用户无 vhost 权限RabbitMQ 日志 + 应用启动日志;Management UI 查看用户权限校对 application.yml;给用户授予 vhost 权限(configure/write/read)
启动时报 Connection refused / TimeoutRabbitMQ 未启动、端口不通、host 写错、容器端口未映射telnet host 5672/nc;查看 RabbitMQ 监听端口启动 RabbitMQ;改正确 host;映射 5672;确认防火墙/网络
消费者不消费但无报错@RabbitListener 未生效(未扫到组件、缺少相关依赖、监听队列名不一致)启动日志是否打印 listener 容器信息;检查 @Component、包扫描确保 HelloConsumer 在扫描路径;队列名与声明一致;保留 spring-boot-starter-amqp
消息中文乱码/显示异常生产者/消费者编码与消息转换器不一致(默认通常 OK,但自定义时易出问题)查看消息体是否为 byte[]/String;检查 message converter明确使用 String;必要时配置 Jackson2JsonMessageConverter 或统一编码策略

其他系列

🚀 AI篇持续更新中(长期更新)

AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用AI工具指南!
AI研究-132 Java 生态前沿 2025:Spring、Quarkus、GraalVM、CRaC 与云原生落地
🔗 AI模块直达链接

💻 Java篇持续更新中(长期更新)

Java-207 RabbitMQ Direct 交换器路由:RoutingKey 精确匹配、队列多绑定与日志分流实战
MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务已完结,Dubbo已完结,MySQL已完结,MongoDB已完结,Neo4j已完结,FastDFS 已完结,OSS已完结,GuavaCache已完结,EVCache已完结,RabbitMQ正在更新… 深入浅出助你打牢基础!
🔗 Java模块直达链接

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解
🔗 大数据模块直达链接

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 8:58:32

GPT-SoVITS训练数据预处理全流程自动化脚本分享

GPT-SoVITS训练数据预处理全流程自动化脚本分享 在个性化语音合成的热潮中&#xff0c;一个现实问题始终困扰着开发者和内容创作者&#xff1a;如何用最少的数据、最短的时间&#xff0c;训练出高保真度的音色克隆模型&#xff1f;传统TTS系统动辄需要几十小时标注语音&#xf…

作者头像 李华
网站建设 2026/9/27 9:28:10

DsHidMini深度解析:Windows平台PS3手柄一键部署与最佳配置方案

DsHidMini作为一款专为索尼DualShock 3手柄设计的虚拟HID迷你用户模式驱动&#xff0c;通过创新的技术架构解决了PS3手柄在Windows平台上的兼容性问题。本文将从技术原理、部署策略到性能优化&#xff0c;为您提供全面的解决方案。 【免费下载链接】DsHidMini Virtual HID Mini…

作者头像 李华
网站建设 2026/9/28 7:46:41

DeepCAD实战指南:5步掌握AI驱动的三维建模神器

还在为复杂的CAD设计而头疼吗&#xff1f;&#x1f914; DeepCAD作为基于深度学习的CAD自动生成系统&#xff0c;将彻底改变你的设计方式。通过变分自编码器与生成对抗网络的融合架构&#xff0c;这个开源项目能够学习参数化CAD序列&#xff0c;实现从简单草图到完整三维模型的…

作者头像 李华
网站建设 2026/9/27 22:24:50

终极指南:3步搞定OBS网页直播插件,让你的直播画面瞬间升级

还在为直播画面单调而烦恼&#xff1f;想让你的直播间拥有动态数据面板、实时互动元素、或者炫酷的网页特效吗&#xff1f;OBS Browser插件正是你需要的解决方案。这款基于Chromium技术的插件能让网页内容无缝融入直播场景&#xff0c;为你的创作带来无限可能。无论你是游戏主播…

作者头像 李华
网站建设 2026/9/26 16:03:15

GetOrganelle终极指南:3步搞定植物细胞器基因组组装难题

还在为叶绿体基因组组装头疼吗&#xff1f;面对海量测序数据&#xff0c;却不知如何高效提取目标序列&#xff1f;GetOrganelle正是你需要的解决方案&#xff01;这款专为植物和真菌设计的细胞器基因组组装工具&#xff0c;让复杂的数据分析变得像拼图游戏一样简单直观。 【免费…

作者头像 李华
网站建设 2026/9/25 18:33:04

Buildozer实战指南:轻松打包Python应用到移动平台

Buildozer是一个功能强大的Python应用打包工具&#xff0c;能够将你的Python代码转化为Android和iOS平台的原生应用。无论你是开发Kivy应用、Flutter项目还是其他Python框架的应用&#xff0c;Buildozer都能提供一站式解决方案&#xff0c;让你专注于代码编写而非复杂的打包流程…

作者头像 李华