在现代分布式系统中,消息队列(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 模块内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论