Spring Jms 模块案例讲解

 更新时间:2025年02月20日 09:45:38   作者:栗筝i  
本文详细介绍了Spring-JMS模块,包括其核心功能和作用,通过ActiveMQ作为消息代理,提供了一个基于XML配置的完整示例,帮助开发者快速掌握Spring-JMS的使用方式,感兴趣的朋友一起看看吧

在现代分布式系统中,消息队列(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 模块概述

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 的核心作用:

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

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.xsd
        http://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 {
    @Override
    public 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,并在项目中灵活运用!

到此这篇关于 Spring Jms 模块案例讲解的文章就介绍到这了,更多相关Spring Jms 模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • win10系统64位jdk1.8的下载与安装教程图解

    win10系统64位jdk1.8的下载与安装教程图解

    这篇文章主要介绍了win10系统64位jdk1.8的下载与安装教程图解,本文给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • IDEA的下载和使用安装详细图文教程

    IDEA的下载和使用安装详细图文教程

    这篇文章主要介绍了IDEA的下载和使用安装,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • java 中的volatile关键字

    java 中的volatile关键字

    这篇文章主要介绍了java 中的volatile关键字,volatile在多处理器开发中保证共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另一个一个线程立马可以读到这个修改的值。下面我们来看看文章的具体介绍内容吧

    2021-12-12
  • 详解Elasticsearch如何把一个索引变为只读

    详解Elasticsearch如何把一个索引变为只读

    这篇文章主要为大家介绍了详解Elasticsearch如何把一个索引变为只读示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 详解Spring Cloud 跨服务数据聚合框架

    详解Spring Cloud 跨服务数据聚合框架

    这篇文章主要介绍了详解Spring Cloud 跨服务数据聚合框架,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Spring @Value注解失效问题解决方案

    Spring @Value注解失效问题解决方案

    这篇文章主要介绍了Spring @Value注解失效问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 归并算法之有序数组合并算法实现

    归并算法之有序数组合并算法实现

    这篇文章主要介绍了归并算法之有序数组合并算法实现的相关资料,需要的朋友可以参考下
    2017-07-07
  • SpringBoot下Mybatis的缓存的实现步骤

    SpringBoot下Mybatis的缓存的实现步骤

    这篇文章主要介绍了SpringBoot下Mybatis的缓存的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Springboot整合mqtt服务的示例代码

    Springboot整合mqtt服务的示例代码

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。本文为大家分享了Springboot整合mqtt服务的示例代码,需要的可以参考一下
    2022-03-03
  • 使用SpringBoot中的Schedule定时发送邮件的方法

    使用SpringBoot中的Schedule定时发送邮件的方法

    在SpringBoot中,你可以使用@Scheduled注解来创建定时任务,@Scheduled注解可以应用于方法上,表示这个方法是一个定时任务,可以根据指定的时间间隔或固定时间执行,本文就给大家介绍一下如何使用SpringBoot中的Schedule定时发送邮件,需要的朋友可以参考下
    2023-08-08

最新评论