Spring Boot 多 ActiveMQ 通道配置与多连接消息发送实战(含完整示例与踩坑记录)
文章目录
- 前言
- 一、环境准备
- 📌 单 ActiveMQ 配置
- 📌 多 ActiveMQ 配置
- 📌 多 MQ 注入使用 controller
- 二、踩坑记录
- 1.✅ NoUniqueBeanDefinitionException
- 2.✅ Could not resolve placeholder
- 总结
- 📌 完整项目源码
- 📌 结语
前言
在实际的企业应用开发中,消息队列(MQ)是系统解耦、异步通讯、高并发削峰填谷的重要手段。尤其是制造业、物流、金融、IoT场景下,常常会同时接入多个 MQ 实例,或者将消息分别投递到不同 MQ 队列与通道中。
Spring Boot 自带的 spring-boot-starter-activemq 默认只支持单个 ActiveMQ 实例。但在实际业务中,我们常常有如下需求:
- 不同业务系统对接不同 MQ 地址
- 数据需要同时发送到多个 MQ
- 不同厂商独立的消息中间件部署
本篇文章将带你完整实现:
✅ 多 ActiveMQ 实例独立配置
✅ 多 JmsMessagingTemplate 实例注入使用
✅ 多消息发送接口与队列定义
✅ 踩坑记录与常见异常排查
一、环境准备
- Spring Boot 2.7.x / 3.x
- ActiveMQ 5.x
- Maven依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
📌 单 ActiveMQ 配置
application.yml:
spring:activemq:broker-url: tcp://localhost:61616user: adminpassword: admin
配置类:
@Configuration
@Slf4j
public class ActivemqConfig {@Value("${spring.activemq.broker-url}")private String brokerUrl;@Value("${spring.activemq.user}")private String username;@Value("${spring.activemq.password}")private String password;// 连接工厂@Beanpublic ConnectionFactory connectionFactory() {return new ActiveMQConnectionFactory(username, password, brokerUrl);}// 消息发送模板@Bean(name = "jmsMessageTemplate")public JmsMessagingTemplate jmsMessagingTemplate() {return new JmsMessagingTemplate(connectionFactory());}// 定义队列@Bean(name = "AOI_J10-1_4")public Queue aoiQueue() {return new ActiveMQQueue("AOI_J10-1_4");}// 其他队列类似
}
📌 多 ActiveMQ 配置
两个mq的配置
application.yml:
spring:activemq:broker-url: tcp://localhost:61616user: adminpassword: adminjt:activemq:broker-url: tcp://192.168.22.130:61616user: adminpassword: admin
配置类:
@Configuration
@Slf4j
public class JtActivemqConfig {@Value("${jt.activemq.broker-url}")private String brokerUrl;@Value("${jt.activemq.user}")private String username;@Value("${jt.activemq.password}")private String password;@Bean(name = "jtConnectionFactory")public ConnectionFactory jtConnectionFactory() {return new ActiveMQConnectionFactory(username, password, brokerUrl);}@Bean(name = "jtJmsMessagingTemplate")public JmsMessagingTemplate jtJmsMessagingTemplate(@Qualifier("jtConnectionFactory") ConnectionFactory connectionFactory) {return new JmsMessagingTemplate(connectionFactory);}// jt MQ 队列@Bean(name = "jtQueue")public Queue jtQueue() {return new ActiveMQQueue("Report_ProductGague_H_The_H_The_Two");}
}
📌 多 MQ 注入使用 controller
Controller 中:
@RestController
@RequestMapping("/api")
@Slf4j
public class DataController {@Resource(name = "jmsMessageTemplate")private JmsMessagingTemplate defaultTemplate;@Resource(name = "jtJmsMessagingTemplate")private JmsMessagingTemplate jtTemplate;@Resource(name = "AOI_J10-1_4")private Queue aoiQueue;@Resource(name = "jtQueue")private Queue jtQueue;@PostMapping("/send")public String sendMessage(@RequestBody String msg) {// 发送到本地 MQdefaultTemplate.convertAndSend(aoiQueue, msg);log.info("已发送至本地队列: {}", aoiQueue);// 同时发送到jt MQjtTemplate.convertAndSend(jtQueue, msg);log.info("已发送至jt队列: {}", jtQueue);return "success";}
}
二、踩坑记录
1.✅ NoUniqueBeanDefinitionException
异常信息:
No qualifying bean of type 'JmsMessagingTemplate' available: expected single matching bean but found 2
原因:
容器中存在两个 JmsMessagingTemplate,Spring 不知道该注入哪个。
解决:
使用 @Resource(name=“”) 或 @Qualifier(“beanName”) 精准指定。
⚠️ 多个 JmsMessagingTemplate Bean 存在,Spring 无法自动装配
✔️ 解决:使用 @Resource(name=“”) 或 @Qualifier(“beanName”) 精确注入
2.✅ Could not resolve placeholder
异常信息:
Could not resolve placeholder 'jt.activemq.broker-url'
原因:
配置文件 application.yml 中缺失该配置。
解决:
补全配置项,或使用 @ConfigurationProperties(prefix = “jt.activemq”) 封装配置对象,更优雅。
⚠️ application.yml 中缺少 jt.activemq.broker-url 配置
✔️ 解决:补全多 MQ 配置项,或者使用 @ConfigurationProperties 封装配置更优雅
总结
本项目实现了:
✅ 多 ActiveMQ 实例独立配置
✅ 多消息发送模板独立 Bean 定义
✅ 多队列动态注入
✅ 实现不同 MQ 消息分发
✅ 避免 Bean 冲突、配置项缺失的常见异常
适用于:
- 多厂商、多业务消息独立通道场景
- 高并发异构系统中间件集成
- 微服务独立 MQ 通讯
本项目实现了:
✅ 多 ActiveMQ 实例独立配置
✅ 多消息发送模板独立 Bean 定义
✅ 多队列动态注入
✅ 实现不同 MQ 消息分发
✅ 避免 Bean 冲突、配置项缺失的常见异常
适用于:
- 多厂商、多业务消息独立通道场景
- 高并发异构系统中间件集成
- 微服务独立 MQ 通讯
📌 完整项目源码
👉 如有需要,可留言或私信,分享完整 Spring Boot 多 ActiveMQ 配置与消息发送 DEMO 项目。
📌 结语
多 MQ 配置在实际生产环境中非常常见,理解 MQ 连接、消息模板、队列定义、消息发送与监听的关系,是搞定 MQ 通讯的基础。
本文就是一份通用、可复制、实战型解决方案,希望对你有帮助。👊
如果你觉得这篇文章有用,别忘了 👉 点赞、收藏、关注,一起搞定 Spring 全家桶!