Spring Boot 集成 ActiveMQ:实现高效消息传递与系统解耦的完整指南

news/2025/2/22 11:29:12/文章来源:https://www.cnblogs.com/java-note/p/18730724

一、环境搭建:安装与配置 ActiveMQ

(一)下载与安装 ActiveMQ

ActiveMQ 是一款开源的、功能强大的消息中间件,广泛应用于企业级应用中。它支持多种消息协议,如 JMS(Java Message Service)、AMQP 等,并提供了丰富的功能,包括消息持久化、事务支持和集群部署。ActiveMQ 的高性能和高可靠性使其成为理想的系统间通信解决方案。

您可以通过 ActiveMQ 官方网站获取最新版本的安装包。根据您的操作系统选择合适的版本进行下载。下载完成后,解压到指定目录,例如 C:\ActiveMQ(Windows)或 /opt/activemq(Linux)。解压完成后,您将看到一个包含多个子目录的文件夹结构,其中 bin 目录包含了启动和管理 ActiveMQ 服务的脚本文件。

(二)启动 ActiveMQ 服务

进入解压后的目录,找到 bin 文件夹。在 Windows 系统中,运行以下命令启动 ActiveMQ 服务:

bin\activemq.bat start

在 Linux 或 macOS 系统中,运行以下命令:

bin/activemq start

启动成功后,您可以通过访问 http://localhost:8161/admin 来访问 ActiveMQ 的 Web 控制台。默认的用户名和密码均为 admin。控制台提供了丰富的管理功能,包括查看队列和主题的状态、发送和接收测试消息等。通过控制台,您可以直观地观察 ActiveMQ 的运行状态,并进行各种配置和管理操作。

(三)验证 ActiveMQ 安装

在控制台中,您可以手动创建一个队列(Queue)或主题(Topic),并发送一条测试消息,以确保 ActiveMQ 服务正常运行。这是后续集成的基础。例如,您可以创建一个名为 testQueue 的队列,并发送一条消息,然后观察是否能够成功接收。如果一切正常,您将看到消息被成功发送和接收的记录,这表明 ActiveMQ 已经正确安装并运行。


二、Spring Boot 项目集成 ActiveMQ

(一)添加依赖

Spring Boot 提供了强大的消息中间件支持,通过 spring-boot-starter-activemq 模块,您可以轻松地将 ActiveMQ 集成到项目中,而无需复杂的配置。spring-boot-starter-activemq 是 Spring Boot 的一个起步依赖,它自动引入了 ActiveMQ 的客户端库以及 Spring 的 JMS 支持模块。Spring Boot 的自动配置机制会根据您提供的配置信息,自动创建并初始化 JMS 模板和连接工厂。

在您的 Spring Boot 项目中,打开 pom.xml 文件,并添加以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

添加依赖后,Spring Boot 会自动处理 ActiveMQ 的基本配置,包括连接工厂的创建和 JMS 模板的初始化。这使得开发者可以专注于业务逻辑的实现,而无需过多关注底层的配置细节。

(二)配置 ActiveMQ

在 Spring Boot 的配置文件中(application.propertiesapplication.yml),添加以下配置以指定 ActiveMQ 的连接信息:

# ActiveMQ 配置
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
  • broker-url 是 ActiveMQ 服务的地址。默认情况下,ActiveMQ 使用 tcp://localhost:61616 作为通信端口。

  • userpassword 是登录 ActiveMQ 的用户名和密码。如果您在安装时未修改默认设置,这里应填写 admin

如果您需要进一步配置 ActiveMQ,例如设置消息持久化、启用集群模式或配置 SSL,可以在 application.properties 文件中添加更多配置项。更多高级配置选项可以参考 Spring Boot 官方文档。

(三)自定义配置(可选)

在某些情况下,您可能需要对 ActiveMQ 的连接工厂或 JMS 模板进行自定义配置。例如,您可能需要启用消息持久化、设置事务管理或配置消息的过期时间。您可以通过创建一个配置类来实现这些自定义配置:

import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;@Configuration
public class ActiveMQConfig {@Beanpublic ActiveMQConnectionFactory connectionFactory() {ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();factory.setBrokerURL("tcp://localhost:61616");factory.setUserName("admin");factory.setPassword("admin");factory.setTrustAllPackages(true); // 允许反序列化所有类return factory;}@Beanpublic JmsTemplate jmsTemplate(ActiveMQConnectionFactory connectionFactory) {JmsTemplate template = new JmsTemplate(connectionFactory);template.setSessionTransacted(true); // 启用事务return template;}@Beanpublic DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ActiveMQConnectionFactory connectionFactory) {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setConcurrency("1-5"); // 设置并发消费者数量return factory;}
}

在这个配置类中,我们自定义了 ActiveMQConnectionFactoryJmsTemplateDefaultJmsListenerContainerFactory。通过这些自定义配置,您可以灵活地调整 ActiveMQ 的行为,以满足复杂的业务需求。


三、实现消息发送与接收

在完成依赖添加和配置后,您需要编写代码来实现消息的发送和接收功能。Spring 提供了 JmsTemplate@JmsListener 注解,使得消息操作变得异常简单。

(一)创建消息生产者

消息生产者的作用是将消息发送到 ActiveMQ 的队列或主题中。您可以创建一个服务类来封装消息发送逻辑:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;@Service
public class MessageProducer {@Autowiredprivate JmsTemplate jmsTemplate;/**     * 发送消息到指定的队列或主题     * @param destination 队列或主题名称     * @param message 消息内容     */public void sendMessage(String destination, String message) {jmsTemplate.send(destination, session -> session.createTextMessage(message));System.out.println("Message sent to " + destination + ": " + message);}
}

在这个类中,sendMessage 方法通过 JmsTemplate 将消息发送到指定的队列或主题。destination 参数可以是队列名称(如 myQueue)或主题名称(如 myTopic),而 message 是要发送的消息内容。通过调用 sendMessage 方法,您可以轻松地将消息发送到 ActiveMQ,而无需关心底层的连接和通信细节。

(二)创建消息消费者

消息消费者的作用是从 ActiveMQ 的队列或主题中接收消息。您可以使用 Spring 的 @JmsListener 注解来实现一个简单的消费者:

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;@Service
public class MessageConsumer {/**     * 监听指定队列的消息     * @param message 接收到的消息内容     */@JmsListener(destination = "myQueue")public void receiveMessage(String message) {System.out.println("Received message from myQueue: " + message);}
}

在这个类中,@JmsListener 注解指定了要监听的队列名称(myQueue)。当有消息到达该队列时,receiveMessage 方法会被自动调用,并打印接收到的消息内容。通过这种方式,您可以轻松地实现消息的接收和处理逻辑。

(三)测试消息发送与接收

为了验证集成是否成功,您可以编写一个测试类来发送消息并观察消费者是否能够正确接收。以下是一个简单的测试类示例:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class ActiveMqIntegrationTest {@Autowiredprivate MessageProducer messageProducer;@Testvoid testSendAndReceiveMessage() {messageProducer.sendMessage("myQueue", "Hello, ActiveMQ!");System.out.println("Message sent successfully!");}
}

运行测试后,您应该能在控制台看到消息被发送和接收的日志。这表明您的 Spring Boot 项目已经成功与 ActiveMQ 集成。通过这种方式,您可以快速验证消息发送和接收的逻辑是否正确,并确保系统能够正常运行。


四、高级功能与优化

在实际项目中,您可能需要使用 ActiveMQ 的更多高级功能,例如消息持久化、事务管理、集群部署等。以下是一些常见的优化建议:

(一)消息持久化

在生产环境中,消息持久化是确保数据不丢失的关键功能。您可以在 ActiveMQ 的配置文件中启用持久化存储。例如,使用 KahaDB 作为持久化存储:

<persistenceAdapter><kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>

同时,在 Spring Boot 的配置文件中,确保 spring.activemq.packages.trust-all 设置为 true,以允许持久化消息的发送。通过启用消息持久化,您可以确保消息在系统故障或重启时不会丢失,从而提高系统的可靠性和稳定性。

(二)事务管理

如果您的业务逻辑需要保证消息的可靠发送和接收,可以使用事务来确保消息的完整性。在 Spring Boot 中,您可以通过 JmsTemplatesetSessionTransacted 方法启用事务:

jmsTemplate.setSessionTransacted(true);

此外,您还可以结合 Spring 的事务管理器(@Transactional 注解)来实现更复杂的事务逻辑。通过事务管理,您可以确保消息的发送和接收操作要么全部成功,要么全部失败,从而避免数据不一致的问题。

(三)集群部署

在高可用性和高并发的场景中,ActiveMQ 支持集群部署。您可以通过配置多个 ActiveMQ 节点,并使用 ZooKeeper 或其他协调服务来实现负载均衡和故障转移。集群部署不仅可以提高系统的可用性,还可以通过分布式架构提升系统的性能和扩展性。

(四)性能优化

对于高吞吐量的应用,您可以通过调整 ActiveMQ 的线程池大小、优化内存使用和调整消息缓存策略来提升性能。例如,在 application.properties 文件中,您可以设置以下参数:

spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=5

这些配置可以显著提升消息处理的效率。此外,您还可以通过监控 ActiveMQ 的性能指标(如队列长度、消息处理时间等),进一步优化系统的性能表现。

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

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

相关文章

联网搜索接口!大模型API和私有化部署联网搜索接口:基于互联网搜索服务的 API 接口技术分享与应用实践

联网搜索接口!大模型API和私有化部署联网搜索接口:基于互联网搜索服务的 API 接口技术分享与应用实践关键词:API 接口、互联网搜索、大模型、私有化部署、数据采集、技术分享、微信小程序、数字续坚、竞品对比一、引言在大模型 API 开发与私有化部署日益普及的背景下,如何在…

687. 最长同值路径(中)

目录题目题解:后序遍历 题目给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。 两个节点之间的路径长度 由它们之间的边数表示。题解:后序遍历通过深度优先搜索后序遍历二叉树,计算并更新每个节点…

week 01 C语言基础

Week01 一.语言基础认知 1.1 C语言是什么? 通过一系列的语法和语义规则来描述计算机程序的行为和逻辑,可以将程序转化为二进制指令,并由CPU执行。 语言=语法+逻辑 1.2 C语言的特点简洁C语言的语法简单,简单明了,使得程序易于阅读和理解。高效C语言的执行效率高,可以用于开…

Qt布局之QSplitter

简述 QSplitter拆分器是一个布局控件。用户通过拖动它们之间的边界来控制子部件的大小。 在不确定子部件UI大小时,可以用此控件布局,让用户自行调整控件尺寸。 属性名称 类型 描述childrenCollapsible bool 用户是否可以将子部件的大小调整为0。默认情况下,子控件是可…

学习理论:预测器-拒绝器多分类弃权学习

弃权学习(learning with abstention)主要是为了使分类器在学习过程中可能出现的误导性或者不正确的信息时(这常被称为“幻觉”),能够对做出预测进行弃权。目前,弃权学习的方法主要可以分为以下几种:基于置信度的方法(confidence-based methods)。这种方法在预训练模型…

Cypher Chapter 6:DIGITAL CRYPTOGRAPHY

PUZZLE1 0110 0100 0110 0001 0111 0100 0110 0001SOLVE1 通过 ASCII 码表可知,明文为 data。 PUZZLE2 HELLO 0011 1111 0010 1010 0011 1110 0010 0000 0010 1011SOLVE2 容易猜出答案是 world,不过如何得到的呢? 考虑将 HELLO 换为 ASCII 码形式,即 0100 1000 0100 0101 0…

2246. 相邻字符不同的最长路径(难)

目录题目题解:dfs 题目给你一棵 树(即一个连通、无向、无环图),根节点是节点 0 ,这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树,其中 parent[i] 是节点 i 的父 节点,由于节点 0 是根节点,所以 parent[0] == -1 。…

普通人如何靠 AI 副业,1 个月实现月薪 3 万 +

在物价飞涨、经济低迷的今天,仅靠死工资,却有着不固定的开销?房贷、车贷、孩子的教育费用…… 望着日益增长的开销,你是否也在夜深人静时,为钱包的羞涩而发愁?无数次幻想过拥有一份高收入的副业,却始终在迷茫中徘徊,不知从何下手。 如今,AI 时代的浪潮汹涌而来,为我们…

C内存模型

分区 在C语言中,内存被分为以下几个部分 .text 代码段,存放程序的可执行代码,不可修改 .rodata(Read Only Data) 常量区,存放全局常量 .data 数据段,存放已初始化的全局变量和静态变量 .bss(Block Started By Symbol) 未初始化数据段,存放未初始化的全局变量或者初始化为…

探秘Transformer系列之(5)--- 训练推理

从零开始解析Transformer,目标是:(1) 解析Transformer如何运作,以及为何如此运作,让新同学可以入门;(2) 力争融入一些比较新的或者有特色的论文或者理念,让老鸟也可以有所收获。探秘Transformer系列之(5)--- 训练&推理 0x00 概述 Transformer训练的目的是通过对输入…

124. 二叉树中的最大路径和(困难)

目录题目题解:后序遍历 题目二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root ,返回…

Windsurf AI编程工具

Windsurf AI编程工具实操指南目录一、环境搭建与核心功能安装与登录模型选择与配置中文环境配置二、开发全流程实操创建项目将api目录下的模型调用抽象为服务层三、避坑指南四、与Cursor对比结语安装包 一、环境搭建与核心功能 安装与登录 访问Windsurf官网下载适配版本,支持W…