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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 天免费试用。