Spring 核心技术解析【纯干货版】- XIV:Spring 消息模块 Spring-Jms 模块精讲

ops/2025/2/28 10:58:50/

在现代分布式系统中,消息队列(Message Queue,MQ)扮演着至关重要的角色,它不仅能够解耦系统各个模块,还能提升系统的可扩展性和可靠性。JMS(Java Message Service)作为 Java EE 规范中的一部分,为 Java 应用提供了一套标准的消息通信 API。然而,JMS 原生 API 相对复杂,涉及较多底层操作,而 Spring-JMS 模块的出现极大地简化了 JMS 在 Spring 应用中的使用,使得消息的发送与接收更加直观且易于维护。

本篇文章将深入解析 Spring-JMS 模块,介绍其核心功能,并通过 ActiveMQ 作为消息代理,提供一个 基于 XML 配置的完整示例,帮助开发者快速掌握 Spring-JMS 的使用方式。


文章目录
      • 1、Spring-Jms 模块介绍
        • 1.1、Spring-Jms 模块概述
        • 1.2、Spring-Jms 模块依赖
        • 1.3、Spring-Jms 模块作用
      • 2、Spring-JMS 案例
        • 2.1、添加依赖
        • 2.2、 配置 Spring XML(spring-jms-config.xml)
        • 2.3、创建消息生产者(Producer)
        • 2.4、创建消息消费者(Consumer)
        • 2.5、启动 Spring 上下文并发送消息
        • 2.6、启动 ActiveMQ
        • 2.7、运行流程
      • X、后记

1、Spring-Jms 模块介绍
1.1、Spring-Jms 模块概述

Spring JMS 模块,是为了简化在 Spring 应用中使用消息传递服务而设计的模块。它提供了对 JMS(Java Message Service)规范的支持,使得开发者能够方便地发送和接收消息,与消息代理(如 ActiveMQ、RabbitMQ 等)进行交互。

Spring JMS 模块简化了消息生产者和消费者端点的配置,同时也集成了 Spring 的事务管理机制,使得消息驱动的架构变得更加易于实现和管理。

1.2、Spring-Jms 模块依赖

Spring-Tx 模块的依赖有四个,分别是 Spring-Beans 模块、Spring-Core 模块、Spring-Tx 模块以及 Spring-Messaging 模块。

其中 Spring Beans 模块是对 Spring Bean 进行定义,实现 IOC 基础功能的模块。Spring-Core 是 Spring 中的基础模块,它提供了框架运行所必需的核心功能。而 Spring Tx 模块,是 Spring 中处理事务管理的模块。

pring Messaging 模块主要关注于消息的抽象处理,支持多种消息传递协议,并且特别强化了对反应式编程模型的支持,使得开发者能更方便地创建高性能、可扩展的分布式系统。

1.3、Spring-Jms 模块作用

Spring-JMS 的核心作用:

  1. 简化 JMS API 操作:Spring-JMS 提供了一套模板化工具(如 JmsTemplate),封装了连接、会话管理等细节,使得发送和接收消息更加便捷。
  2. 支持消息驱动(Message-Driven):提供 @JmsListener 注解,可以将方法声明为 JMS 消息监听器,接收消息时自动触发。
  3. 支持事务管理:与 Spring 的事务管理集成,支持声明式事务,确保消息在消费时的 一致性和可靠性。
  4. 与 Spring IoC 容器集成:允许使用 Spring 配置管理 JMS 连接工厂(ConnectionFactory)、目的地(Queue/Topic)、消息监听容器等组件。
  5. 支持消息转换(Message Conversion):提供 MessageConverter 机制,支持将对象自动转换为 JMS 消息格式(如 JSON、XML)。
  6. 支持多种 JMS 提供者: 可与 ActiveMQ、Artemis、RabbitMQ(通过 JMS 兼容接口) 等消息中间件集成。

2、Spring-JMS 案例

本案例演示如何在 Spring目中使用 Spring-JMS 进行消息传递,基于 ActiveMQ 作为消息代理。

2.1、添加依赖

pom.xml 中添加 Spring-JMS 和 ActiveMQ 相关依赖:

<dependencies><!-- Spring Core 依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.39</version></dependency><!-- Spring JMS 依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>5.3.39</version></dependency><!-- ActiveMQ 依赖 --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-spring-boot-starter</artifactId><version>2.0.1</version></dependency><!-- JMS API 依赖 --><dependency><groupId>javax.jms</groupId><artifactId>javax.jms-api</artifactId><version>2.0.1</version></dependency>
</dependencies>
springjmsconfigxml_96">2.2、 配置 Spring XML(spring-jms-config.xml)

使用 XML 配置文件 定义 连接工厂、JmsTemplate、监听器 等:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jms="http://www.springframework.org/schema/jms"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd"><!-- 配置 ActiveMQ 连接工厂 --><bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"><constructor-arg value="tcp://localhost:61616"/>  <!-- ActiveMQ 服务器地址 --></bean><!-- 配置 JMS 模板 --><bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="connectionFactory"/></bean><!-- 配置消息监听器容器 --><bean id="jmsListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"><property name="connectionFactory" ref="connectionFactory"/><property name="destinationName" value="test.queue"/><property name="messageListener" ref="messageReceiver"/></bean><!-- 消息消费者(监听器) --><bean id="messageReceiver" class="com.example.jms.MessageReceiver"/>
</beans>
2.3、创建消息生产者(Producer)

使用 JmsTemplate 发送消息:

package com.example.jms;import org.springframework.jms.core.JmsTemplate;import javax.jms.Queue;public class MessageSender {private JmsTemplate jmsTemplate;private Queue queue;// 构造方法注入public MessageSender(JmsTemplate jmsTemplate, Queue queue) {this.jmsTemplate = jmsTemplate;this.queue = queue;}public void sendMessage(String message) {System.out.println("发送消息:" + message);jmsTemplate.convertAndSend(queue, message);}
}
2.4、创建消息消费者(Consumer)

实现 MessageListener 接口 来监听消息:

package com.example.jms;import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;public class MessageReceiver implements MessageListener {@Overridepublic void onMessage(Message message) {try {if (message instanceof TextMessage) {String text = ((TextMessage) message).getText();System.out.println("收到消息:" + text);}} catch (Exception e) {e.printStackTrace();}}
}
2.5、启动 Spring 上下文并发送消息
package com.example.jms;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;import javax.jms.Queue;public class JmsApp {public static void main(String[] args) {// 加载 Spring XML 配置ApplicationContext context = new ClassPathXmlApplicationContext("spring-jms-config.xml");// 获取 JmsTemplate 和队列JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmsTemplate");Queue queue = (Queue) context.getBean("testQueue");// 发送消息MessageSender sender = new MessageSender(jmsTemplate, queue);sender.sendMessage("Hello, Spring-JMS!");System.out.println("消息已发送!");}
}
2.6、启动 ActiveMQ

确保 ActiveMQ 已启动

activemq start

默认 Web 控制台地址(可查看队列消息):

http://localhost:8161/admin

默认用户名/密码:

admin / admin
2.7、运行流程
  • 先启动 ActiveMQ 服务器。
  • 运行 JmsApp 发送消息。
  • MessageReceiver 监听到消息并打印到控制台。

X、后记

在本篇文章中,我们详细介绍了 Spring-JMS 模块的作用、依赖结构以及如何在非 Spring Boot 环境下集成 ActiveMQ,实现消息的发送与消费。通过使用 Spring-JMS,开发者可以更加高效地管理消息通信,并与 Spring 生态系统无缝集成,如结合事务管理、消息转换等特性,进一步提升系统的健壮性和可维护性。

在实际项目中,我们可以基于 Spring-JMS 结合其他 MQ 组件(如 RabbitMQ、Kafka)构建更加高效的异步消息处理系统。如果你对 Spring 消息驱动架构 感兴趣,可以进一步学习 Spring Cloud Stream,以便在微服务架构下实现更加灵活的事件驱动模式。希望本篇文章能够帮助你更好地理解 Spring-JMS,并在项目中灵活运用!


http://www.ppmy.cn/ops/161940.html

相关文章

(八)Java-Collection

一、Collection接口 1.特点 Collection实现子类可以存放多个元素&#xff0c;每个元素可以是Object&#xff1b; 有些Collection的实现类&#xff0c;可以存放重复的元素&#xff0c;有些不可以&#xff1b; 有些Collection的实现类&#xff0c;有些是有序的&#xff08;Li…

分治算法、动态规划、贪心算法、分支限界法和回溯算法的深度对比

1. 分治算法 (Divide and Conquer) 核心思想 分治法三步曲&#xff1a; 分解&#xff08;Divide&#xff09;&#xff1a;将原问题拆分为多个子问题解决&#xff08;Conquer&#xff09;&#xff1a;递归解决子问题合并&#xff08;Combine&#xff09;&#xff1a;合并子问题…

LeetCode 701.二叉搜索树中的插入操作

题目描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能存在多种有效的…

Idea 中 Project Structure简介

在 IntelliJ IDEA 中&#xff0c;Project Structure&#xff08;项目结构&#xff09;对话框是一个非常重要的配置界面&#xff0c;它允许你对项目的各个方面进行详细的设置和管理。下面将详细介绍 Project Structure 中各个主要部分的功能和用途。 1. Project&#xff08;项…

RabbitMQ高级特性----生产者确认机制

题记&#xff1a;在Java微服务开发中&#xff0c;对于一个功能需要调用另一个服务下的功能才能实现的情况&#xff0c;我们通常会使用异步调用取代同步调用&#xff0c;进而实现增强业务的可拓展性和实现故障隔离以及流量削峰填谷的目的。而消息队列就是异步调用的解决方案之一…

基于大数据的音乐网站数据分析与可视化推荐系统

【大数据】基于大数据的音乐网站数据分析与可视化推荐系统&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本选题旨在设计并实现一款基于大数据技术的音乐网站数据分析与可视化推荐系统&#x…

linux在vim中查找和替换

在Linux中使用Vim编辑器查找文本的方法非常直观和强大。Vim是一个高度可配置的文本编辑器&#xff0c;支持多种查找和替换的命令。下面是一些基本的查找命令&#xff1a; 1. 向前查找 要向前查找文本&#xff0c;可以使用以下命令&#xff1a; /text_to_find 例如&#xff0c…

[数字排列]

数字排列 真题目录: 点击去查看 E 卷 100分题型 题目描述 小明负责公司年会,想出一个趣味游戏: 屏幕给出 1 ~ 9 中任意 4 个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第 N 位置的数字,其中 N 为给出数字中最大的(如果不到这么多数字则给…