Spring Boot 多 ActiveMQ 通道配置与多连接消息发送实战(含完整示例与踩坑记录)

发布于:2025-07-04 ⋅ 阅读:(14) ⋅ 点赞:(0)


前言

在实际的企业应用开发中,消息队列(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:61616
    user: admin
    password: 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;

    // 连接工厂
    @Bean
    public 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:61616
    user: admin
    password: admin

jt:
  activemq:
    broker-url: tcp://192.168.22.130:61616
    user: admin
    password: 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) {
        // 发送到本地 MQ
        defaultTemplate.convertAndSend(aoiQueue, msg);
        log.info("已发送至本地队列: {}", aoiQueue);

        // 同时发送到jt MQ
        jtTemplate.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 全家桶!


网站公告

今日签到

点亮在社区的每一天
去签到