0

0

Spring Boot整合ActiveMQ的详细配置教程

雪夜

雪夜

发布时间:2025-07-04 09:24:02

|

681人浏览过

|

来源于php中文网

原创

spring boot整合activemq的核心在于引入依赖、配置连接信息并使用jms模板进行消息发送与接收。1. 引入maven依赖,包括spring-boot-starter-activemq、activemq-broker(可选)和activemq-pool以支持连接池;2. 在application.properties或application.yml中配置activemq的连接地址、认证信息、连接池及监听器参数;3. 使用jmstemplate实现消息发送,通过@jmslistener注解实现消息接收;4. 若需同时支持队列和主题,可通过自定义jmslistenercontainerfactory配置发布/订阅模式;5. 为确保对象传输正确,应实现serializable接口或配置mappingjackson2messageconverter;6. 实践中应注意幂等性处理、事务管理、并发消费控制、确认机制选择及异常处理;7. 常见陷阱包括未启用连接池、序列化问题、事务混淆和消息丢失风险;8. 性能优化建议包括合理设置并发数、批量处理、控制消息大小、使用非持久化消息及优化activemq broker配置。整个过程实现了系统解耦、提升响应速度、增强弹性、削峰填谷及最终一致性,适用于构建高可用、高并发、易扩展的分布式系统。

Spring Boot整合ActiveMQ的详细配置教程

说起Spring Boot和ActiveMQ的联手,其实就是给你的应用装上一对“异步翅膀”,让它能更优雅地处理那些无需即时反馈、或者需要排队处理的任务。核心嘛,无非是把ActiveMQ的客户端库请进来,然后在配置文件里告诉Spring Boot怎么找到它,最后再用JMS模板这把趁手的工具去发发消息、收收消息。整个过程,Spring Boot的自动化配置能帮你省去不少繁琐的XML配置,让集成变得异常丝滑。

Spring Boot整合ActiveMQ的详细配置教程

解决方案

要让Spring Boot和ActiveMQ“手牵手”,我们得从Maven依赖开始,然后是核心的配置,最后再看看如何发送和接收消息。

Spring Boot整合ActiveMQ的详细配置教程

首先,在你的pom.xml里,引入Spring Boot的ActiveMQ启动器:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!-- 如果你需要嵌入式ActiveMQ或者特定的连接池,可能还需要这个 -->
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-broker</artifactId>
    <scope>runtime</scope>
</dependency>
<!-- 推荐使用连接池,比如PooledConnectionFactory -->
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-pool</artifactId>
</dependency>

接下来是配置,这是关键。在application.propertiesapplication.yml中指定ActiveMQ连接信息:

Spring Boot整合ActiveMQ的详细配置教程
# ActiveMQ Broker URL,默认是tcp://localhost:61616
spring.activemq.broker-url=tcp://localhost:61616
# 如果ActiveMQ需要认证,设置用户名和密码
spring.activemq.user=admin
spring.activemq.password=admin
# 是否开启嵌入式ActiveMQ,如果设置为true,Spring Boot会启动一个内置的ActiveMQ实例
# spring.activemq.in-memory=true
# 开启JMS事务支持,建议在需要原子性操作时开启
spring.activemq.jms.listener.acknowledge-mode=AUTO_ACKNOWLEDGE
spring.activemq.jms.listener.auto-startup=true
spring.activemq.jms.listener.concurrency=3
spring.activemq.jms.listener.max-concurrency=10
# 启用ActiveMQ连接池,这在生产环境非常重要
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
spring.activemq.pool.idle-timeout=30000

配置好了,就可以写代码了。发送消息通常使用JmsTemplate

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

@Component
public class MessageSender {

    private final JmsTemplate jmsTemplate;

    @Autowired
    public MessageSender(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    public void sendMessage(String destination, String message) {
        System.out.println("发送消息到队列 " + destination + ": " + message);
        // convertAndSend 会自动帮你处理序列化
        jmsTemplate.convertAndSend(destination, message);
    }

    public void sendObjectMessage(String destination, Object object) {
        System.out.println("发送对象消息到队列 " + destination + ": " + object);
        jmsTemplate.convertAndSend(destination, object);
    }
}

接收消息则更简单,一个@JmsListener注解就能搞定:

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class MessageReceiver {

    // 监听名为 "my.queue" 的队列
    @JmsListener(destination = "my.queue")
    public void receiveQueueMessage(String message) {
        System.out.println("从队列 my.queue 收到消息: " + message);
        // 模拟一些处理耗时
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    // 监听名为 "my.topic" 的主题
    @JmsListener(destination = "my.topic", containerFactory = "jmsTopicListenerContainerFactory")
    public void receiveTopicMessage(String message) {
        System.out.println("从主题 my.topic 收到消息: " + message);
    }

    // 如果要接收对象,确保对象是可序列化的,或者配置自定义消息转换器
    @JmsListener(destination = "object.queue")
    public void receiveObjectMessage(MyCustomObject myObject) {
        System.out.println("从队列 object.queue 收到对象: " + myObject.getName() + ", " + myObject.getValue());
    }
}

注意,如果你同时使用队列(Queue)和主题(Topic),或者需要为主题配置独立的连接工厂,你可能需要自定义一个JmsListenerContainerFactory,比如上面receiveTopicMessage方法中引用的jmsTopicListenerContainerFactory。这通常通过一个@Configuration类来完成:

import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
import org.springframework.jms.support.converter.MessageType;

import javax.jms.ConnectionFactory;

@Configuration
public class JmsConfig {

    // 配置用于Topic的JMS监听容器工厂
    @Bean
    public JmsListenerContainerFactory<?> jmsTopicListenerContainerFactory(
            ConnectionFactory connectionFactory,
            DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        factory.setPubSubDomain(true); // 启用发布/订阅域(Topic)
        // 可以根据需要配置更多的属性,比如并发数、事务管理器等
        // factory.setTransactionManager(...)
        // factory.setConcurrency("3-10");
        return factory;
    }

    // 如果需要发送和接收JSON格式的对象,可以配置一个消息转换器
    @Bean
    public MappingJackson2MessageConverter jacksonJmsMessageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT); // 消息体是文本
        converter.setTypeIdPropertyName("_type"); // 在消息头中添加类型信息
        return converter;
    }
}

别忘了,如果你的自定义对象要通过JMS发送,它需要实现Serializable接口,或者你配置了像MappingJackson2MessageConverter这样的消息转换器,让它能把对象转成文本(比如JSON)来传输。

Spring Boot与ActiveMQ结合,到底能解决哪些痛点?

我个人觉得,最核心的还是解耦。原来那种牵一发而动全身的调用,比如用户注册成功后,既要发邮件又要发短信,还可能要更新积分、生成报表数据,如果都放在一个事务里同步执行,那整个流程会非常长,任何一个环节出错都可能导致整个注册失败。而且,业务逻辑之间耦合度高,改动一个地方可能要牵连好几个模块。

DBShop开源电子商务网店系统
DBShop开源电子商务网店系统

DBShop电子商务系统具备统一的系统设置、简单的商品管理、灵活的商品标签、强大的商品属性、方便的配送费用管理、自由的客服设置、独立的广告管理、全面的邮件提醒、详细的管理权限设置、整合国内外知名支付网关、完善的系统更新(可在线自动更新或手动更新)功能、细致的帮助说明、无微不至的在线教程……,使用本系统绝对是一种享受!

下载

引入ActiveMQ后,这些操作就可以变成独立的事件通知。用户注册成功后,只管往“用户注册成功”这个队列里丢个消息,然后邮件服务、短信服务、积分服务各自去监听这个队列,收到消息后独立处理自己的业务。这样一来:

  1. 提高响应速度:用户注册接口能立即返回,用户体验更好。
  2. 增强系统弹性:某个服务挂了,不影响其他服务,消息会留在队列里,等服务恢复后继续处理。
  3. 降低耦合度:各服务之间只通过消息协议通信,不再直接依赖,系统架构更清晰,易于维护和扩展。
  4. 削峰填谷:面对突发流量,消息队列能把瞬时高峰的请求缓存起来,让后端服务按照自己的处理能力慢慢消化。这就像一个蓄水池,避免了洪水直接冲垮下游。
  5. 实现最终一致性:对于分布式事务,虽然不能保证强一致性,但通过消息队列可以实现最终一致性,保证所有相关操作最终都能完成。

所以,与其说ActiveMQ是个消息中间件,不如说它是构建高可用、高并发、易扩展分布式系统的“粘合剂”和“缓冲垫”。它能让你的微服务架构变得更健壮、更灵活。

在Spring Boot中,ActiveMQ的消息生产与消费有哪些实践技巧?

说到实践,光知道怎么配还不够,还得知道怎么用得更“地道”。

消息生产(Sender)方面:

  1. 幂等性考量:虽然消息队列通常能保证消息“至少一次”投递,但这意味着消费者可能会收到重复消息。所以,生产消息时,如果业务允许,最好在消息体里带上一个业务ID(比如订单ID),消费者拿到后先检查是否已处理过,确保操作的幂等性。
  2. 消息序列化:默认情况下,JmsTemplate.convertAndSend()会尝试将Java对象序列化。如果你发送的是自定义对象,确保它们实现了Serializable接口。但更推荐的做法是使用JSON或XML格式,配合MappingJackson2MessageConverter等转换器,这样跨语言、跨平台兼容性更好,也更易于调试。毕竟,谁也不想在生产环境遇到NotSerializableException这种低级错误。
  3. 事务性发送:如果你的消息发送是业务流程的一部分,且需要和数据库操作保持原子性,可以考虑将JMS操作纳入Spring的事务管理。通过@Transactional注解或编程式事务,确保消息只在数据库事务提交后才真正发送出去,或者在事务回滚时消息也被回滚。这通常需要配置一个支持JMS的事务管理器,比如JtaTransactionManager或者ActiveMQTransactionManager

消息消费(Receiver)方面:

  1. 并发消费@JmsListener注解的concurrencymax-concurrency属性非常有用。它们控制了监听器容器启动的消费者线程数。concurrency是最小线程数,max-concurrency是最大线程数。合理设置这两个值,可以根据消息量动态调整消费能力,避免消息堆积。但也不是越大越好,线程太多会增加上下文切换开销,还可能耗尽数据库连接等资源。
  2. 消息确认机制(Acknowledge Mode):这是个很重要的点。ActiveMQ有几种确认模式:
    • AUTO_ACKNOWLEDGE(默认):消费者收到消息后自动确认,最简单但可能丢失消息(如果处理失败)。
    • CLIENT_ACKNOWLEDGE:需要手动调用message.acknowledge()确认,提供更细粒度的控制,但忘记确认会导致消息重复消费。
    • DUPS_OK_ACKNOWLEDGE:允许重复确认,性能略高,但消费者必须能处理重复消息。
    • SESSION_TRANSACTED:消息的发送和接收都在一个事务中,事务提交时才确认消息。 选择哪种模式取决于你的业务对消息可靠性的要求。我通常倾向于CLIENT_ACKNOWLEDGE配合异常处理,或者在更复杂的场景下使用事务。
  3. 异常处理:消费者在处理消息时难免会遇到异常。默认情况下,如果@JmsListener方法抛出异常,消息会根据确认模式和重试策略被重新投递。你可以自定义一个JmsListenerContainerFactory,并通过setErrorHandler()方法来处理这些异常,比如记录日志、将消息发送到死信队列(DLQ)或进行自定义重试。不要让异常直接“裸奔”,那会带来很多不确定性。
  4. 消息转换器:和发送端一样,接收端也需要知道如何将接收到的消息体转换为Java对象。如果发送方使用了JSON,接收方也应该配置MappingJackson2MessageConverter。保持两端转换器的一致性是避免MessageConversionException的关键。

这些都是在实际项目中摸索出来的经验,没有哪个是银弹,但掌握了这些,能让你在处理消息队列时少走很多弯路。

Spring Boot整合ActiveMQ时,常见的配置陷阱与性能优化建议?

整合过程中,坑是少不了的,性能优化也是永恒的话题。

配置陷阱:

  1. 连接池未启用或配置不当:这是最常见的陷阱之一。Spring Boot默认情况下会为JMS提供一个连接工厂,但它可能不是一个连接池。在生产环境中,每次发送或接收消息都创建新的JMS连接和会话是非常低效且资源消耗巨大的。务必在application.properties中启用spring.activemq.pool.enabled=true,并合理配置spring.activemq.pool.max-connections等参数。我踩过几次坑,最典型的就是连接池没配好,生产环境一跑起来,那资源消耗简直是灾难,连接数蹭蹭往上涨,直接拖垮应用。
  2. 序列化问题:如果你通过JMS发送自定义Java对象,但该对象没有实现Serializable接口,或者对象结构复杂、包含不可序列化的字段,那恭喜你,你会遇到NotSerializableException。即使实现了Serializable,如果两端JVM版本、类路径不一致,也可能出现InvalidClassException。最稳妥的办法还是统一使用文本协议(如JSON),然后通过消息转换器进行序列化和反序列化。
  3. JMS事务与Spring事务的混淆:虽然Spring提供了对JMS事务的支持,但如果你的业务同时涉及数据库和JMS,并且要求强一致性,那么你需要的是分布式事务(JTA),而不是简单的JMS本地事务。混淆这两种概念,可能导致数据不一致。简单场景下,使用JMS本地事务或Spring的JmsTransactionManager就够了,但涉及到多个资源管理器时,就得考虑Atomikos或Narayana这样的JTA实现。
  4. 消息丢失风险:在AUTO_ACKNOWLEDGE模式下,如果消费者在处理消息过程中发生异常或崩溃,消息可能已经从队列中移除,导致丢失。对于关键业务消息,要么使用CLIENT_ACKNOWLEDGE模式并确保在处理完成后手动确认,要么使用事务模式。

性能优化建议:

  1. 启用连接池:上面已经强调了,这是最基础也是最重要的优化。
  2. 合理设置并发消费者数量:根据你的服务器CPU核数、业务处理耗时、ActiveMQ的吞吐能力来调整spring.activemq.jms.listener.concurrencymax-concurrency。过多的线程会带来上下文切换开销,过少则无法充分利用资源。
  3. 批量发送/接收:如果业务场景允许,尝试批量发送消息。虽然JmsTemplate没有直接的批量发送API,但你可以在业务层将多条消息打包成一个消息发送,或者在事务中发送多条消息。接收端也可以一次性拉取多条消息进行处理。
  4. 消息大小与复杂性:尽量保持消息体小巧、简洁。过大的消息会增加网络传输开销和ActiveMQ的存储压力。避免在消息中传递整个复杂对象图,只传递必要的ID或关键数据,让消费者自己去查询详细信息。
  5. 持久化与非持久化:对于非关键性、允许丢失的消息(如日志、统计数据),可以使用非持久化消息,这样可以显著提高ActiveMQ的吞吐量,因为它不需要将消息写入磁盘。默认是持久化消息。
  6. 消息选择器(Message Selector):如果你有大量不同类型的消息进入同一个队列,并且只有部分消费者关心特定类型的消息,可以使用消息选择器。这样消费者只会拉取符合条件的消息,减少不必要的网络传输和消息过滤开销。但滥用选择器也会增加ActiveMQ的负担,需要权衡。
  7. ActiveMQ Broker优化:除了客户端配置,ActiveMQ服务器本身的配置也很重要,比如存储策略(KahaDB vs LevelDB)、内存限制、网络传输优化等。这些通常是运维层面需要考虑的。

说到底,性能优化和避免陷阱,很多时候就是对资源、可靠性和复杂度的权衡。没有一劳永逸的配置,只有最适合你当前业务场景的方案。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

156

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

139

2023.09.05

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

408

2023.10.12

Java Spring Boot开发
Java Spring Boot开发

本专题围绕 Java 主流开发框架 Spring Boot 展开,系统讲解依赖注入、配置管理、数据访问、RESTful API、微服务架构与安全认证等核心知识,并通过电商平台、博客系统与企业管理系统等项目实战,帮助学员掌握使用 Spring Boot 快速开发高效、稳定的企业级应用。

73

2025.08.19

Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性
Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性

Spring Boot 是一个基于 Spring 框架的 Java 开发框架,它通过 约定优于配置的原则,大幅简化了 Spring 应用的初始搭建、配置和开发过程,让开发者可以快速构建独立的、生产级别的 Spring 应用,无需繁琐的样板配置,通常集成嵌入式服务器(如 Tomcat),提供“开箱即用”的体验,是构建微服务和 Web 应用的流行工具。

148

2025.12.22

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

271

2025.12.24

Spring Boot企业级开发与MyBatis Plus实战
Spring Boot企业级开发与MyBatis Plus实战

本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。

32

2026.02.11

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RunnerGo从入门到精通
RunnerGo从入门到精通

共22课时 | 1.8万人学习

尚学堂Mahout视频教程
尚学堂Mahout视频教程

共18课时 | 3.3万人学习

Linux优化视频教程
Linux优化视频教程

共14课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号