spring jms使用

在這里插入圖片描述

文章目錄

  • 一、背景介紹
  • 二、注意點說明
  • 三、代碼
    • pom.xml
    • mq.properties
    • ActiveMqConfig
    • JmsSender
    • ActiveMqInfo
    • ActivemqProtocolEnum
    • 生產者
    • 消費者

一、背景介紹

<dependency> 標簽中列出的 spring-jms 是 Spring Framework 提供的一個模塊,用于簡化 Java Message Service (JMS) 的開發。它本身并不是 ActiveMQ 的 JMS 推送,但可以與 ActiveMQ 一起使用,以實現 JMS 消息的發送和接收。

解釋

  1. Spring JMS:
    • spring-jms 提供了一些便利的功能和抽象,使得使用 JMS 更加簡單和直觀。它支持消息的發送、接收、事務管理等功能,并提供了模板類(如 JmsTemplate)來簡化消息的發送和接收過程。
  2. ActiveMQ:
    • ActiveMQ 是一個流行的開源消息代理,支持 JMS 協議。它可以作為消息中間件,允許不同的應用程序通過消息進行通信。

二、注意點說明

三、代碼

pom.xml

<dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>4.2.3.RELEASE</version>
</dependency>

mq.properties

# jms
activemq.brokerURL=tcp://20.150.12.141:18750
activemq.sessionCacheSize=20
activemq.ip=20.150.12.141
activemq.port=18750
activemq.protocol=tcp

ActiveMqConfig

package com.hero.lte.ems.jms.config;import com.hero.lte.ems.configuration.DynamicConfig;
import com.hero.lte.ems.configuration.DynamicConfigLoader;
import com.hero.lte.ems.jms.EMSJmsTemplate;
import com.hero.lte.ems.jms.support.enums.ActivemqProtocolEnum;
import com.hero.lte.ems.jms.support.model.ActiveMqInfo;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.jms.pool.PooledConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.connection.CachingConnectionFactory;import javax.jms.ConnectionFactory;@Configuration
public class ActiveMqConfig {private String brokerURL;private Integer sessionCacheSize;@Bean(name = "activemqInfo")public ActiveMqInfo activeMqInfo(){ActiveMqInfo activeMqInfo = new ActiveMqInfo();DynamicConfig config = DynamicConfigLoader.load("mq.properties");activeMqInfo.setIp(config.getString("activemq.ip"));activeMqInfo.setPort(config.getInt("activemq.port"));activeMqInfo.setProtocolEnum(ActivemqProtocolEnum.formatEnum(config.getString("activemq.protocol")));return activeMqInfo;}@Beanpublic ActiveMQConnectionFactory connectionFactory() {DynamicConfig config = DynamicConfigLoader.load("mq.properties");brokerURL = config.getString("activemq.protocol")+"://"+config.getString("activemq.ip")+":"+config.getString("activemq.port");sessionCacheSize = config.getInt("activemq.sessionCacheSize");ActiveMQConnectionFactory activeMQConnectionFactory= new ActiveMQConnectionFactory(brokerURL);activeMQConnectionFactory.setUseAsyncSend(true);activeMQConnectionFactory.setTrustAllPackages(true);return activeMQConnectionFactory;}@Beanpublic PooledConnectionFactory pooledConnectionFactory(ActiveMQConnectionFactory activeMQconnectionFactory){DynamicConfig config = DynamicConfigLoader.load("mq.properties");brokerURL = config.getString("activemq.protocol")+"://"+config.getString("activemq.ip")+":"+config.getString("activemq.port");sessionCacheSize = config.getInt("activemq.sessionCacheSize");PooledConnectionFactory pooledConnectionFactory= new PooledConnectionFactory();pooledConnectionFactory.setConnectionFactory(activeMQconnectionFactory);pooledConnectionFactory.setMaxConnections(100);pooledConnectionFactory.setExpiryTimeout(20000);return pooledConnectionFactory;}@Beanpublic CachingConnectionFactory cachingConnectionFactory(ActiveMQConnectionFactory activeMQconnectionFactory) {CachingConnectionFactory connectionFactory = new CachingConnectionFactory();connectionFactory.setSessionCacheSize(sessionCacheSize);connectionFactory.setTargetConnectionFactory(activeMQconnectionFactory);return connectionFactory;}@Beanpublic EMSJmsTemplate jmsTemplate(CachingConnectionFactory connectionFactory) {EMSJmsTemplate jmsTemplate = new EMSJmsTemplate();jmsTemplate.setPubSubDomain(true);jmsTemplate.setReceiveTimeout(1000);jmsTemplate.setExplicitQosEnabled(true);jmsTemplate.setConnectionFactory(connectionFactory);return jmsTemplate;}@Beanpublic JmsListenerContainerFactory<?> jmsListenerContainerTopic(CachingConnectionFactory activeMQConnectionFactory) {DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();bean.setPubSubDomain(true);bean.setConnectionFactory(activeMQConnectionFactory);return bean;}@Beanpublic JmsListenerContainerFactory<?> jmsListenerContainerQueue(CachingConnectionFactory activeMQConnectionFactory) {DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();bean.setConnectionFactory(activeMQConnectionFactory);return bean;}}

JmsSender

package com.hero.lte.ems.cdc.jms;import com.alibaba.fastjson.JSON;
import com.hero.lte.ems.cdc.constant.CdcConstant;
import com.hero.lte.ems.cdc.producer.ActiveMQMessageProducer;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.JmsException;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import javax.jms.*;
import java.util.UUID;/*** JMS消息發送者*/
@Service
public class JmsSender {private final String key = UUID.randomUUID().toString();@ResourceActiveMQMessageProducer activeMQMessageProducer;private static Logger log = LoggerFactory.getLogger(JmsSender.class);@Resourceprivate JmsTemplate jmsTemplate;public void send(String message) {activeMQMessageProducer.send(CdcConstant.JMS_CDC, key, message);}/*** 推送消息** @param destName 消息主題* @param obj      消息內容 (json格式發送出去)*/public void send(final String destName, final Object obj, final Boolean isPubSubDomain) {
//        EMSJmsTemplate jmsTemplate = SpringContextHolder.getBean("jmsTemplate");try {Destination destination = null;if (isPubSubDomain) {destination = new ActiveMQTopic(destName);} else {destination = new ActiveMQQueue(destName);}jmsTemplate.send(destination, new MessageCreator() {@Overridepublic Message createMessage(Session session) throws JMSException {TextMessage msg = session.createTextMessage();if (obj instanceof String) {msg.setText(obj.toString());} else {msg.setText(JSON.toJSONString(obj));}log.debug("Send {}-{}", destName, obj);return msg;}});} catch (JmsException e) {log.error(" jms push info to client error : ", e);}}/*** 推送消息** @param destName 消息主題 topic* @param obj      消息內容 (json格式發送出去)*/public void send(final String destName, final Object obj) {send(destName, obj, true);}/*** 推送消息并監聽響應(訂閱模式)** @param topic 消息主題* @param obj   消息內容 (json格式發送出去)* @return*/public String sendAndReceive(final String topic, final Object obj) {
//        EMSJmsTemplate jmsTemplate = (EMSJmsTemplate) SpringContextHolder.getBean("jmsTemplate");try {Message message = jmsTemplate.sendAndReceive(topic, new MessageCreator() {@Overridepublic Message createMessage(Session session) throws JMSException {TextMessage msg = session.createTextMessage();// 設置消息內容msg.setText(JSON.toJSONString(obj));log.debug("sendAndReceive {}-{}", topic, obj);return msg;}});if (message != null) {return ((TextMessage) message).getText();}} catch (JmsException | JMSException e) {log.error(" jms push info to client error : ", e);}return null;}}

ActiveMqInfo

package com.hero.lte.ems.jms.support.model;import com.hero.lte.ems.jms.support.enums.ActivemqProtocolEnum;import java.io.Serializable;public class ActiveMqInfo implements Serializable
{/*** */private static final long serialVersionUID = -2965965930227658765L;private String ip;private int port;private ActivemqProtocolEnum protocolEnum;public String getIp(){return ip;}public void setIp(String ip){this.ip = ip;}public int getPort(){return port;}public void setPort(int port){this.port = port;}public ActivemqProtocolEnum getProtocolEnum(){return protocolEnum;}public void setProtocolEnum(ActivemqProtocolEnum protocolEnum){this.protocolEnum = protocolEnum;}@Overridepublic String toString(){StringBuilder sb = new StringBuilder();sb.append("ActiveMqInfo:[");sb.append("ip:").append(ip).append(",");sb.append("port").append(port).append(",");sb.append("protocolEnum").append(protocolEnum);sb.append("]");return sb.toString();}
}

ActivemqProtocolEnum

package com.hero.lte.ems.jms.support.enums;import java.io.Serializable;public enum ActivemqProtocolEnum implements Serializable {/*** Tcp*/TCP("tcp");private String protocol;public String getProtocol(){return protocol;}private ActivemqProtocolEnum(String protocol){this.protocol = protocol;}@Overridepublic String toString(){return protocol;}public static ActivemqProtocolEnum formatEnum(String protocol){for (ActivemqProtocolEnum protocolItem : ActivemqProtocolEnum.values()){if (protocolItem.protocol.equalsIgnoreCase(protocol)){return protocolItem;}}return null;}}

生產者

import com.hero.lte.ems.jms.JmsSender;JmsSender.send(JmsConstant.OBSERVE_REPORT_RECEIVE_JMS, json);

消費者

@JmsListener(destination = JmsConstant.OBSERVE_REPORT_RECEIVE_JMS, containerFactory = "jmsListenerContainerTopic")public void receive(String msg) {logger.debug("receive message={}", msg);......}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83217.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83217.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83217.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

筆記——學習HTTP協議

HTTP協議 文章目錄 HTTP協議一、統一資源定位符&#xff08;url&#xff09;&#xff1a;URL編碼格式&#xff1a; 二、HTTP報文結構&#xff1a;三、HTTP請求方法&#xff1a;四、HTTP常見請求頭&#xff1a;五、HTTP狀態碼&#xff1a;六、HTTP常見響應頭&#xff1a;七、HTT…

Unity中的Mathf.Clamp01

2025年6月8日&#xff0c;周日晚上 Mathf.Clamp01 是 Unity 中的一個數學函數&#xff0c;它的作用是將一個浮點數&#xff08;float&#xff09;限制在0 到 1的范圍內。具體來說&#xff1a; 如果輸入值 小于 0&#xff0c;則返回 0。 如果輸入值 大于 1&#xff0c;則返回 1…

1 Studying《Linux Media Documentation》

目錄 1 MEDIA SUBSYSTEM ADMIN AND USER GUIDE 1.1.2 Building support for a media device 1.1.3 Infrared remote control support in video4linux drivers 1.1.4 Digital TV 1.1.5 Cards List 1.1.5.2 PCI drivers 1.1.6 Video4Linux (V4L) driver-specifific docume…

編譯原理 學習 2025年6月10日11:17:54

編譯原理 將高級編程語言編寫的源代碼轉換成機器可執行的代碼(二進制或匯編代碼) 核心任務: 詞法分析(正則表達式和有限自動機): 示例Token分類&#xff1a;關鍵字&#xff1a;if, while 運算符&#xff1a;, 標識符&#xff1a;變量名 分解源代碼為單詞 識別 其中關鍵字 …

風中低語:Linux 信號處理的藝術與實踐

文章目錄 &#x1f307;前言&#x1f3d9;?正文1、信號的處理時機1.1、處理情況1.2、“合適” 的時機 2、用戶態與內核態2.1、概念2.2、重談進程地址空間2.3、信號的處理過程 3、信號的捕捉3.1、內核如何實現信號的捕捉&#xff1f;3.2、sigaction 4、信號部分小結 補充 5、可…

ASP.NET Core SignalR - 部分客戶端消息發送

文章目錄 前言一、消息發送的核心概念1.客戶端標識2.消息接收范圍 二、向特定用戶發送消息管理員向指定用戶發送私信&#xff0c;或用戶之間一對一聊天。 三、向組發送消息聊天室、工作群組、通知訂閱等。 四、廣播消息系統公告、實時統計數據更新等。 五、向角色發送消息向管理…

前后端交互過程中—各類文件/圖片的上傳、下載、顯示轉換

前后端交互過程中—各類文件/圖片的上傳、下載、顯示轉換 圖片上傳下載常用函數&#xff1a;new Blob()**blobParts&#xff1a;&#xff08;必傳&#xff09;****options&#xff1a;&#xff08;可選&#xff09;**blob的常見的MIME類型&#xff1a; URL.createObjectURL()替…

校園二手交易平臺(微信小程序版)

文章目錄 1. 項目概述2. 項目功能思維導圖3. 技術架構1. 前端技術棧2. 后端技術棧 4. 核心模塊實現5. 總結6. 項目實現效果截圖7. 關于作者其它項目視頻教程介紹 1. 項目概述 校園二手交易平臺微信小程序旨在為在校學生提供一個便捷的二手物品交易渠道&#xff0c;包含用戶模塊…

Linux簡單的操作

ls ls 查看當前目錄 ll 查看詳細內容 ls -a 查看所有的內容 ls --help 查看方法文檔 pwd pwd 查看當前路徑 cd cd 轉路徑 cd .. 轉上一級路徑 cd 名 轉換路徑 …

【芯片設計- RTL 數字邏輯設計入門 4.2 -- 組合邏輯賦值 + 時序邏輯狀態保持】

文章目錄 Overview原語句分析變量含義假設(根據命名推測)狀態更新邏輯詳解狀態轉移邏輯舉個實際例子小結Overview 本文將詳細介紹 verilog rtl 中 assign reg_halt_mode_nx = halt_taken | (reg_halt_mode & ~halt_return);的作用,以及這里為何要使用 reg_halt_mode,…

【單片機期末】匯編試卷

一、選擇題 DPTR是16位的&#xff0c;所以尋址范圍是64KB R1是8位的&#xff0c;只能尋址256 訪問內部ROM只能用MOVC指令 一個指令周期是時鐘周期的1/12 12個時鐘周期是一個機器周期 單指令周期是指一個機器周期 T 1 / f 12MHz ~ 1us 13位計數16位計數8位自動重裝載雙8位計數器…

校驗枚舉類類型的入參合法性的統一方案

文章目錄 背景解決實踐定義枚舉類 InEnum注解定義驗證邏輯 InEnumValidator 實際使用 背景 業務要做電商平臺做入參, 在電商平臺被抽離成枚舉類的情況下 &#xff0c;要怎么驗證輸入的參數是正確的呢? 解決 Constraint 實現自定義驗證邏輯 Constraint 注解用于標注其他注解&am…

Unity-NavMesh詳解-其一

今天我們來詳細地探究一下Unity的NavMesh這一性能強大的組件&#xff1a; NavMesh基本使用 NavMesh簡單地說本質上是一個自動尋路的AI組件&#xff0c;我們首先來學習基本的使用。 畫面中我已經添加好了地面&#xff0c;目標&#xff0c;障礙物以及玩家四個要素。 注意我們要…

vue的created和mounted區別

在Vue.js中&#xff0c;created和mounted的核心區別在于調用時機和DOM可訪問性?&#xff1a;created鉤子在組件實例創建后、DOM掛載前調用&#xff0c;適用于數據初始化&#xff1b;mounted鉤子在DOM掛載后調用&#xff0c;支持DOM操作。?? ?調用時機與核心能力對比? ?…

MySQL 8.0 OCP 英文題庫解析(十四)

Oracle 為慶祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免費考取原價245美元的MySQL OCP 認證。 從今天開始&#xff0c;將英文題庫免費公布出來&#xff0c;并進行解析&#xff0c;幫助大家在一個月之內輕松通過OCP認證。 本期公布試題121~130 試題1…

【HarmonyOS 5】拍攝美化開發實踐介紹以及詳細案例

以下是 HarmonyOS 5 拍攝美化功能的簡潔介紹&#xff0c;整合核心能力與技術亮點&#xff1a; 一、AI 影像創新 ?AI 魔法移圖? 系統級圖像分層技術實現人物/物體自由拖拽、縮放與復制&#xff0c;突破傳統構圖限制。自動分離主體與背景&#xff0c;一鍵生成錯位創意照&…

【Java多線程從青銅到王者】懶漢模式的優化(九)

懶漢模式的問題 我們看上述的代碼&#xff0c;當第一次調用getIntance的時候&#xff0c;intance為null&#xff0c;就會進入if里面&#xff0c;創建出實例&#xff0c;當不是第一次調用的時候&#xff0c;此時的intandce不是null&#xff0c;不進入循環&#xff0c;直接return…

SCI期刊查重參考文獻會被查重嗎?

查重的時候&#xff0c;參考文獻不會被查重。 不管中文還是英文查重系統里一般都有排除參考文獻的設置。 比如英文查重系統iThenticate 的排除文獻的設置如下&#xff1a; 在iThenticate在線報告界面的右下角點擊“漏斗”圖標&#xff08;Filter&#xff09;&#xff0c; ?…

OpenLayers 獲取地圖狀態

注&#xff1a;當前使用的是 ol 5.3.0 版本&#xff0c;天地圖使用的key請到天地圖官網申請&#xff0c;并替換為自己的key 地圖狀態信息包括中心點、當前縮放級別、比例尺以及當前鼠標移動位置信息等&#xff0c;在WebGIS開發中&#xff0c;地圖狀態可以方便快捷的向用戶展示基…

JxBrowser 8.8.0 版本發布啦!

一次調用即可下載文件精準清除瀏覽數據右鍵點擊位置檢測獲取元素在視口中的位置 &#x1f517; 點擊此處了解更多詳情。 &#x1f193; 獲取 30 天免費試用。