Spring Jms 模塊案例講解
在現(xiàn)代分布式系統(tǒng)中,消息隊(duì)列(Message Queue,MQ)扮演著至關(guān)重要的角色,它不僅能夠解耦系統(tǒng)各個(gè)模塊,還能提升系統(tǒng)的可擴(kuò)展性和可靠性。JMS(Java Message Service)作為 Java EE 規(guī)范中的一部分,為 Java 應(yīng)用提供了一套標(biāo)準(zhǔn)的消息通信 API。然而,JMS 原生 API 相對(duì)復(fù)雜,涉及較多底層操作,而 Spring-JMS 模塊的出現(xiàn)極大地簡(jiǎn)化了 JMS 在 Spring 應(yīng)用中的使用,使得消息的發(fā)送與接收更加直觀且易于維護(hù)。
本篇文章將深入解析 Spring-JMS 模塊,介紹其核心功能,并通過(guò) ActiveMQ 作為消息代理,提供一個(gè) 基于 XML 配置的完整示例,幫助開發(fā)者快速掌握 Spring-JMS 的使用方式。
1、Spring-Jms 模塊介紹
1.1、Spring-Jms 模塊概述
Spring JMS 模塊,是為了簡(jiǎn)化在 Spring 應(yīng)用中使用消息傳遞服務(wù)而設(shè)計(jì)的模塊。它提供了對(duì) JMS(Java Message Service)規(guī)范的支持,使得開發(fā)者能夠方便地發(fā)送和接收消息,與消息代理(如 ActiveMQ、RabbitMQ 等)進(jìn)行交互。
Spring JMS 模塊簡(jiǎn)化了消息生產(chǎn)者和消費(fèi)者端點(diǎn)的配置,同時(shí)也集成了 Spring 的事務(wù)管理機(jī)制,使得消息驅(qū)動(dòng)的架構(gòu)變得更加易于實(shí)現(xiàn)和管理。
1.2、Spring-Jms 模塊依賴
Spring-Tx 模塊的依賴有四個(gè),分別是 Spring-Beans 模塊、Spring-Core 模塊、Spring-Tx 模塊以及 Spring-Messaging 模塊。
其中 Spring Beans 模塊是對(duì) Spring Bean 進(jìn)行定義,實(shí)現(xiàn) IOC 基礎(chǔ)功能的模塊。Spring-Core 是 Spring 中的基礎(chǔ)模塊,它提供了框架運(yùn)行所必需的核心功能。而 Spring Tx 模塊,是 Spring 中處理事務(wù)管理的模塊。
pring Messaging 模塊主要關(guān)注于消息的抽象處理,支持多種消息傳遞協(xié)議,并且特別強(qiáng)化了對(duì)反應(yīng)式編程模型的支持,使得開發(fā)者能更方便地創(chuàng)建高性能、可擴(kuò)展的分布式系統(tǒng)。
1.3、Spring-Jms 模塊作用
Spring-JMS 的核心作用:
- 簡(jiǎn)化 JMS API 操作:Spring-JMS 提供了一套模板化工具(如
JmsTemplate),封裝了連接、會(huì)話管理等細(xì)節(jié),使得發(fā)送和接收消息更加便捷。 - 支持消息驅(qū)動(dòng)(Message-Driven):提供
@JmsListener注解,可以將方法聲明為 JMS 消息監(jiān)聽器,接收消息時(shí)自動(dòng)觸發(fā)。 - 支持事務(wù)管理:與 Spring 的事務(wù)管理集成,支持聲明式事務(wù),確保消息在消費(fèi)時(shí)的 一致性和可靠性。
- 與 Spring IoC 容器集成:允許使用 Spring 配置管理 JMS 連接工廠(ConnectionFactory)、目的地(Queue/Topic)、消息監(jiān)聽容器等組件。
- 支持消息轉(zhuǎn)換(Message Conversion):提供
MessageConverter機(jī)制,支持將對(duì)象自動(dòng)轉(zhuǎn)換為 JMS 消息格式(如 JSON、XML)。 - 支持多種 JMS 提供者: 可與 ActiveMQ、Artemis、RabbitMQ(通過(guò) JMS 兼容接口) 等消息中間件集成。
2、Spring-JMS 案例
本案例演示如何在 Spring目中使用 Spring-JMS 進(jìn)行消息傳遞,基于 ActiveMQ 作為消息代理。
2.1、添加依賴
在 pom.xml 中添加 Spring-JMS 和 ActiveMQ 相關(guān)依賴:
<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、監(jiān)聽器 等:
<?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 服務(wù)器地址 -->
</bean>
<!-- 配置 JMS 模板 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
<!-- 配置消息監(jiān)聽器容器 -->
<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>
<!-- 消息消費(fèi)者(監(jiān)聽器) -->
<bean id="messageReceiver" class="com.example.jms.MessageReceiver"/>
</beans>2.3、創(chuàng)建消息生產(chǎn)者(Producer)
使用 JmsTemplate 發(fā)送消息:
package com.example.jms;
import org.springframework.jms.core.JmsTemplate;
import javax.jms.Queue;
public class MessageSender {
private JmsTemplate jmsTemplate;
private Queue queue;
// 構(gòu)造方法注入
public MessageSender(JmsTemplate jmsTemplate, Queue queue) {
this.jmsTemplate = jmsTemplate;
this.queue = queue;
}
public void sendMessage(String message) {
System.out.println("發(fā)送消息:" + message);
jmsTemplate.convertAndSend(queue, message);
}
}2.4、創(chuàng)建消息消費(fèi)者(Consumer)
實(shí)現(xiàn) MessageListener 接口 來(lái)監(jiān)聽消息:
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、啟動(dòng) Spring 上下文并發(fā)送消息
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 和隊(duì)列
JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmsTemplate");
Queue queue = (Queue) context.getBean("testQueue");
// 發(fā)送消息
MessageSender sender = new MessageSender(jmsTemplate, queue);
sender.sendMessage("Hello, Spring-JMS!");
System.out.println("消息已發(fā)送!");
}
}2.6、啟動(dòng) ActiveMQ
確保 ActiveMQ 已啟動(dòng):
activemq start
默認(rèn) Web 控制臺(tái)地址(可查看隊(duì)列消息):
http://localhost:8161/admin
默認(rèn)用戶名/密碼:
admin / admin
2.7、運(yùn)行流程
- 先啟動(dòng) ActiveMQ 服務(wù)器。
- 運(yùn)行
JmsApp發(fā)送消息。 MessageReceiver監(jiān)聽到消息并打印到控制臺(tái)。
X、后記
在本篇文章中,我們?cè)敿?xì)介紹了 Spring-JMS 模塊的作用、依賴結(jié)構(gòu)以及如何在非 Spring Boot 環(huán)境下集成 ActiveMQ,實(shí)現(xiàn)消息的發(fā)送與消費(fèi)。通過(guò)使用 Spring-JMS,開發(fā)者可以更加高效地管理消息通信,并與 Spring 生態(tài)系統(tǒng)無(wú)縫集成,如結(jié)合事務(wù)管理、消息轉(zhuǎn)換等特性,進(jìn)一步提升系統(tǒng)的健壯性和可維護(hù)性。
在實(shí)際項(xiàng)目中,我們可以基于 Spring-JMS 結(jié)合其他 MQ 組件(如 RabbitMQ、Kafka)構(gòu)建更加高效的異步消息處理系統(tǒng)。如果你對(duì) Spring 消息驅(qū)動(dòng)架構(gòu) 感興趣,可以進(jìn)一步學(xué)習(xí) Spring Cloud Stream,以便在微服務(wù)架構(gòu)下實(shí)現(xiàn)更加靈活的事件驅(qū)動(dòng)模式。希望本篇文章能夠幫助你更好地理解 Spring-JMS,并在項(xiàng)目中靈活運(yùn)用!
到此這篇關(guān)于 Spring Jms 模塊案例講解的文章就介紹到這了,更多相關(guān)Spring Jms 模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 基于SpringBoot中activeMq的JmsTemplate的實(shí)例
- SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解
- SpringBoot 整合 JMSTemplate的示例代碼
- Spring Boot基于Active MQ實(shí)現(xiàn)整合JMS
- Spring整合Weblogic jms實(shí)例詳解
- 詳解spring boot整合JMS(ActiveMQ實(shí)現(xiàn))
- spring整合JMS實(shí)現(xiàn)同步收發(fā)消息(基于ActiveMQ的實(shí)現(xiàn))
- Spring-boot JMS 發(fā)送消息慢的解決方法
相關(guān)文章
SpringBoot權(quán)限認(rèn)證-Sa-Token的使用詳解
Sa-Token是一款輕量級(jí)Java權(quán)限認(rèn)證框架,它簡(jiǎn)化了權(quán)限管理,提高了開發(fā)效率,本文通過(guò)實(shí)例介紹了Sa-Token的基本概念、與其他框架的比較、基本語(yǔ)法和高級(jí)用法,并探討了其核心原理和實(shí)際應(yīng)用場(chǎng)景,感興趣的朋友一起看看吧2024-09-09
詳解為什么阿里巴巴禁止使用BigDecimal的equals方法做等值比較
這篇文章主要介紹了詳解為什么阿里巴巴禁止使用BigDecimal的equals方法做等值比較,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
SpringBoot結(jié)合Tess4J實(shí)現(xiàn)拍圖識(shí)字的示例代碼
圖片中的文字提取已經(jīng)越來(lái)越多地應(yīng)用于數(shù)據(jù)輸入和自動(dòng)化處理過(guò)程,本文主要介紹了SpringBoot結(jié)合Tess4J實(shí)現(xiàn)拍圖識(shí)字的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
Java正則表達(dá)式之Pattern類實(shí)例詳解
Pattern類的作用在于編譯正則表達(dá)式后創(chuàng)建一個(gè)匹配模式,下面這篇文章主要給大家介紹了關(guān)于Java正則表達(dá)式之Pattern類的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01
一文詳解Java中的反射與new創(chuàng)建對(duì)象
Java中的反射(Reflection)和使用new關(guān)鍵字創(chuàng)建對(duì)象是兩種不同的對(duì)象創(chuàng)建方式,各有優(yōu)缺點(diǎn)和適用場(chǎng)景,本文小編給大家詳細(xì)介紹了Java中的反射與new創(chuàng)建對(duì)象,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-07-07
Spring security 如何開放 Swagger 訪問(wèn)權(quán)限
這篇文章主要介紹了Spring security 如何開放 Swagger 訪問(wèn)權(quán)限操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot集成Druid實(shí)現(xiàn)監(jiān)控功能的示例代碼
這篇文章主要介紹了SpringBoot集成Druid實(shí)現(xiàn)監(jiān)控功能,Druid是阿里巴巴開發(fā)的號(hào)稱為監(jiān)控而生的數(shù)據(jù)庫(kù)連接池,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況,天生就是針對(duì)監(jiān)控而生的DB連接池,文中通過(guò)代碼示例講解非常詳細(xì),需要的朋友可以參考下2024-02-02

