一、JMS简介
JMS消息可以有效的调动程序中的各种动作,例如,当我们完成一个动作后,我们需要一些程序完成他们自己相应的动作,这时候我们只需要发送一个消息出来,当他们接收到这个消息时,就可以完成自己的事情,是一个很方便的技术,现在用到的JMS消息一般都是通过ActiveMQ来完成,ActIveMQ是一个成熟的框架,可以通过tcp发送JMS,还可以在程序内发送JMS,下面来通过一个实例来介绍。
二、环境搭建
这个实例是在Spring的基础上完成的,所以需要导入spring的所有jar包,当然还需要导入activemq的jar包,下载activemq以后就可以找到一个activemq-all.jar的jar包,导入即可
三、配置文件简介
首先application.xml配置文件内容如下
<?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:context="http://www.springframework.org/schema/context" xmlns:jms="http://www.springframework.org/schema/jms" xmlns:amq="http://activemq.apache.org/schema/core" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 激活组件扫描功能,在包cn.ysh.studio.spring.aop及其子包下面自动扫描通过注解配置的组件 --> <context:annotation-config /> <context:component-scan base-package="main.java.com"/> <!-- 激活自动代理功能 --> <aop:aspectj-autoproxy proxy-target-class="true"/> <import resource="jms_client.xml"/> </beans>
这里的spring就是完成了组件扫描以及aop代理的一些配置,然后就是导入配置activemq的配置文件,如下
<?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:context="http://www.springframework.org/schema/context" xmlns:jms="http://www.springframework.org/schema/jms" xmlns:amq="http://activemq.apache.org/schema/core" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 激活组件扫描功能,在包cn.ysh.studio.spring.aop及其子包下面自动扫描通过注解配置的组件 --> <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean"> <property name="config" value="classpath:main/java/conf/ActiveMQConfig.xml" /> <property name="start" value="true" /> </bean> <bean id="myamqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://10.10.11.37:61616"/> <property name="trustedPackages"> <list> <value>main.java</value> </list> </property> </bean> <bean id="myconnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <property name="targetConnectionFactory" ref="myamqConnectionFactory"></property> <property name="sessionCacheSize" value="100" /> </bean> <bean id="myjmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate"> <constructor-arg ref="myconnectionFactory" /> <property name="pubSubDomain" value="false" /> </bean> <bean id="myjmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate"> <constructor-arg ref="myconnectionFactory" /> <property name="pubSubDomain" value="true" /> </bean> </beans>
这里第一步因为不是完整的activemq,是spring嵌入式activemq,所以需要启动一个broker来启动activemq,这里需要用到的是一个另外的activemq配置,内容如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd"> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" /> <broker useJmx="false" persistent="false" xmlns="http://activemq.apache.org/schema/core"> <transportConnectors> <transportConnector uri="tcp://10.10.11.37:61616"/> </transportConnectors> </broker> </beans>
启动完broker之后就算是完成了acrivemqmq的启动,接下来就开始定义连接工厂了,连接工厂需要制定brokerURL和信任包(不知道有什么卵用),接着就是吧activemq的连接工厂转换成spring的连接工厂,最后两个就不多说了,一个是队列消息templete一个是主题消息template,都是非常简单的,其中如果我们把tcp改为vm则是在程序内发送JMS消息
四、一个服务
在这里我们需要写一个服务用来注册消息监听器,发送消息 , 先把代码贴出来吧
package main.java.com.consumer; import java.io.Serializable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.Queue; import javax.jms.Session; import javax.jms.Topic; import org.apache.activemq.command.ActiveMQQueue; import org.apache.activemq.command.ActiveMQTopic; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessageCreator; import org.springframework.stereotype.Component; @Component("msgService") public class MsgServiceImpl { //存放注册了的监听器 private Map<String ,Object> consumers = new ConcurrentHashMap<String , Object>(); @Autowired @Qualifier("myjmsQueueTemplate") private JmsTemplate queueTemplate ; @Autowired @Qualifier("myjmsTopicTemplate") private JmsTemplate topicTemplate ; @Autowired @Qualifier("myconnectionFactory") private ConnectionFactory connectionFactory ; public void sendMsg(String destation ,final Serializable message){ if(consumers.containsKey(destation)){ if(consumers.get(destation) instanceof Queue){ queueTemplate.send(destation , new MessageCreator() { @Override public Message createMessage(Session session) throws JMSException { return session.createObjectMessage(message); } }); return ; } if(consumers.get(destation) instanceof Topic){ topicTemplate.send(destation , new MessageCreator() { @Override public Message createMessage(Session session) throws JMSException { return session.createObjectMessage(message); } }); } return ; } } public void registerConsumer(Consumer consumer , JMSConstant type){ try { Connection connection = connectionFactory.createConnection() ; connection.start(); Session session = connection.createSession( false, Session.AUTO_ACKNOWLEDGE) ; if(type != null && type.equals(JMSConstant.TYPE_TOPIC)){ Topic topic = new ActiveMQTopic(consumer.getName()) ; MessageConsumer messageConsumer = session.createConsumer(topic) ; messageConsumer.setMessageListener(new JmsMessageListener(consumer)); consumers.put(consumer.getName(), topic) ; }else{ Queue queue = new ActiveMQQueue(consumer.getName()) ; MessageConsumer messageConsumer = session.createConsumer(queue) ; messageConsumer.setMessageListener(new JmsMessageListener(consumer)); consumers.put(consumer.getName(), queue) ; } } catch (JMSException e) { e.printStackTrace(); } } }
简单说一下吧,首先把这个类注册到spring中,名字为msgService 然后定义一个map来存放目的地,接着就是开始定义的template和从测测提哦你Factory了这些都不多说,都是开始定义了的东西
第一个方法:
sendMsg
可以看到他的参数有两个,一个为目的地,一个为消息内容 ,如果目的地未注册则返回不发送消息,发送消息我们选择发送Object消息,当然所有的Object实例都需要实现Serializable序列化,然后创建消息发送出去
第二个方法
registerConsumer
注册监听器,这里先介绍接口Consumer
package main.java.com.consumer; import java.io.Serializable; public interface Consumer { public String getName() ; public void onMessage(Serializable msg); }
所有的监听器都需要实现这个接口,
然后自己定义一个JmsMessageListener :
package main.java.com.consumer; import java.io.Serializable; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.ObjectMessage; public class JmsMessageListener implements MessageListener{ private Consumer consumer ; public JmsMessageListener(Consumer consumer){ this.consumer = consumer ; } @Override public void onMessage(Message msg) { if(msg != null){ try{ consumer.onMessage(createObjectMsg(msg)) ; }catch(Exception e){ e.printStackTrace() ; } } } private Serializable createObjectMsg(Message msg) throws Exception { Serializable message = ((ObjectMessage) msg).getObject() ; return message ; } }
这个很简单不多说,这是这个服务两个简单必须的方法、
这样我们只需定义一个监听器,
package main.java.com.consumer; import java.io.Serializable; public class JmsConsumer1 implements Consumer{ @Override public String getName() { return MsgTypeInfo.TEST.name(); } @Override public void onMessage(Serializable msg) { System.out.println("JmsConsumer1 收到 消息 "+ msg); } }
然后把它注册到服务,msgService.registerConsumer(new JmsConsumer1(), JMSConstant.TYPE_TOPIC) ;
我们发送一条消息:
msgService.sendMsg(MsgTypeInfo.TEST.name(), "132") ;
就可以看到控制台打印到了接收到的消息。
相关推荐
一种改进的自适应短时傅里叶变方法-基于梯度下降 算法运行环境为Jupyter Notebook,执行一种改进的自适应短时傅里叶变方法-基于梯度下降,附带参考。 算法可迁移至金融时间序列,地震 微震信号,机械振动信号,声发射信号,电压 电流信号,语音信号,声信号,生理信号(ECG,EEG,EMG)等信号。 sr = 1e4 t = torch.arange(0, 2.5, 1 sr) f = torch.sin(2*pi*t) * 1e2 + 1e2 * torch.ones_like(t) + 5e1 * t x = (torch.sin(torch.cumsum(f, dim=0) 2e2) + 0.1 *torch.randn(t.shape))[None, :] x += torch.sin(torch.cumsum(1e2*5 * torch.ones_like(t), dim=0) 2e2) x = x.to(device) print(x.shape) plt.plot(f)
源码 一个Java GUI 图书借阅系统源码. 一个Java GUI 图书借阅系统源码.
螺旋藻过滤机sw21可编辑全套技术资料100%好用.zip
【java】基于java+SSM-考试系统
【python设计模式】大话设计模式python实现
内容概要:本文详细介绍了太原理工大学围绕JavaEE技术栈展开的一系列实践项目。首先介绍了校内课程实践项目,比如学生信息管理系统和校园在线选课系统,旨在让学生熟悉分层架构开发模式及其各层次的具体技术应用(如Servlet、Spring、MyBatis),从而掌握前后端交互的基本流程及数据存取方式。其次针对更高阶的学习目标提到学科竞赛类项目如 ACM 国际大学生程序设计竞赛项目和中国大学生计算机设计大赛项目,鼓励学生挑战算法实现与优化,同时培养他们的创新能力和服务意识。最后着眼于提升学生的就业竞争力阐述了校企合作项目的具体内容,强调在真实的工作环境中积累经验的重要性,包括参与企业级Web应用程序开发以及大数据分析和可视化的平台建设等方面。 适合人群:面向高等院校计算机专业的大三及以上年级的学生或是有兴趣深入了解JavaEE并在实践中成长的学习者。 使用场景及目标:①通过具体案例让读者深刻体会从理论学习转向实际动手制作的过程;②为参加编程赛事提供灵感和支持;③加强学校与行业的对接,使在校生能提前适应职场的要求。 其他说明:以上实践项目的设置反映了当前互联网行业的最新动态和技术趋势,既有利于学生个人发展也为社会输送更多优秀的IT人才做出了贡献。
【课程设计】TensorRT部署DETR项目工程python源码.zip
【vue】基于vue开发的pad考试系统
【课程设计】基于百度飞桨paddle实现语音情感识别源码+项目说明.zip
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解)。 3:34页范例参考毕业论文,万字长文,word文档,支持二次编辑。 4:27页范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关教程资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 ssm 框架(Spring+SpringMVC+MyBatis)搭建后台。用 MySQL 存储数据,可靠性强。 能学到什么: 学会用ssm搭建后台,提升效率、专注业务。学习使用jsp、html构建交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
模型预测控制,燃料电池混动能量管理 编程平台matlab,.m文件 基于MPC的燃料电池混合动力系统能量管理策略,该程序是本人自己编写,程序没有任何问题,备注书写详细,可根据你的实际情况更你对应的工况便可以使用。 注意:1.本程序选择的目标函数考虑了动力系统的性能衰 ,可作为创新点 2.该程序预测部分框架可以改变,通过更精确的预测进行能量管理可作为另一个创新点 3.本程序以bp预测,另有lstm工具箱预测,可更 4.可以调节soc始末一致 6.可更任意工况运行
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解)。 3:34页范例参考毕业论文,万字长文,word文档,支持二次编辑。 4:27页范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关教程资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 ssm 框架(Spring+SpringMVC+MyBatis)搭建后台。用 MySQL 存储数据,可靠性强。 能学到什么: 学会用ssm搭建后台,提升效率、专注业务。学习使用jsp、html构建交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
【毕业设计】基于SpringBoot开发的酒店管理系统源码.zip
Matlab实现Attention-GRU多变量时间序列预测 1.Matlab实现Attention-GRU多变量时间序列预测(注意力机制融合门控循环单元,也可称呼TPA-GRU,时间注意力机制结合门控循环单元) 2.运行环境为Matlab2020b: 3.data为数据集,MainAttGRUNM.m为主程序,运行即可;其余m文件为子函数,无需运行,所有文件放在一个文件夹,赠送俩个Attention-GRU学习的文献: 4.运行需要GPU支持运算
【课程设计】基于python+html实现爬虫+neo4j+D3实现的苏州旅游知识图谱源码+数据.zip
Enterprise Architect (简称EA) 是我们做软件设计及开发要使用的工具,它的功能非常多,有很多功能大家都不熟悉。在这里总结了一些比较高级的使用方法分享给大家。(比较基础的UML画图方法,在别的地方有很多介绍,本课程中不再详述)。本课程内容如下: EA可以做什么? 用EA编写和管理“需求” EA的Project Browser操作 EA项目的基本设计原则 元素的Name和Alias自动编号 创建测试用例的规范描述 建立和查看Traceability EA中增加一个Tag (Tagged Value) EA的Diagram操作 EA中创建Object对象的方法 EA中设置连线或元素的Stereotype
单线程爬虫-上线资源包
乐鑫ESP32-S3红外重复码值发送参考代码。虽然不是整个工程,但红外这一部分是全的,已经调通,能够正常发送红外重复码值。 乐鑫官方在红外发送重复码这一块存在空白,本代码填补了这一空白。给需要使用ESP32系列芯片的人直接提供了代码,无需再自行摸索,甚至无从下手。
台达DVP-20PM的追剪程序,同步运动,是用在卷纸管机上的 这份资料包括: 1、电气图纸一份 2、DVP-20PM的程序(有注释) 3、台达伺服的参数设置源文件(从台达B2伺服中导出) 4、说明书一份 该款卷纸切管机机械结构设计合理,使用钢结构机架和方通为主体,以2500P R高分辨率编码器检查送纸速度与送纸长度;采用一台台达高性能变频器驱动三台电机作为原材料上胶、三层纸的合理重叠卷纸,具有同步性能好、同步精度高等优势;采用三台台达B2系列16bit编码器分辨率伺服电机控制卷纸内芯轴装置、外辊轴装置、追剪装置,精度高、稳定性好、同步精度高等优势;并配备台达BOP-BO7S411触摸屏、台达DVP-20PM00M PLC ,等一系列台达产品,达到通讯建议,匹配度高,稳定性能好等效果。