JMS 之 Active MQ 的spring整合
一、与spring整合实现ptp的同步接收消息
pom.xml:
- <!-- https://mvnrepository.com/artifact/org.springframework/spring-jms -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jms</artifactId>
- <version>4.3.7.RELEASE</version>
- </dependency>
- <!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-pool -->
- <dependency>
- <groupId>org.apache.activemq</groupId>
- <artifactId>activemq-pool</artifactId>
- <version>5.9.0</version>
- </dependency>
spring-jms.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:jms="http://www.springframework.org/schema/jms"
- xmlns:amq="http://activemq.apache.org/schema/core"
- xsi:schemaLocation="http://activemq.apache.org/schema/core
- http://activemq.apache.org/schema/core/activemq-core.xsd
- http://www.springframework.org/schema/jms
- http://www.springframework.org/schema/jms/spring-jms.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd">
- <!-- ActiveMQConnectionFactory就是JMS中负责创建到ActiveMQ连接的工厂类 -->
- <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" >
- <property name="brokerURL" value="tcp://192.168.0.224:61616"/>
- </bean>
- <!-- 创建连接池 -->
- <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
- <property name="connectionFactory" ref="connectionFactory"/>
- <property name="maxConnections" value="10"/>
- </bean>
- <!-- Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory -->
- <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
- <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>
- </bean>
- <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
- <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
- <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
- <property name="connectionFactory" ref="cachingConnectionFactory"/>
- </bean>
- <!--这个是队列目的地,点对点的-->
- <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
- <constructor-arg index="0" value="spring-queue"/>
- </bean>
- </beans>
ConnectionFactory是用于产生到JMS服务器的链接的,Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory。SingleConnectionFactory对于建立JMS服务器链接的请求会一直返回同一个链接,并且会忽略Connection的close方法调用。CachingConnectionFactory继承了SingleConnectionFactory,所以它拥有SingleConnectionFactory的所有功能,同时它还新增了缓存功能,它可以缓存Session、MessageProducer和MessageConsumer。这里我们使用CachingConnectionFactory来作为示例。
消息生产者:
- package com.jalja.org.jms.spring;
- import javax.jms.Destination;
- import javax.jms.JMSException;
- import javax.jms.Message;
- import javax.jms.Session;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import org.springframework.jms.core.JmsTemplate;
- import org.springframework.jms.core.MessageCreator;
- public class SpringJmsSend {
- public static void main(String[] args) {
- ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
- JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
- Destination queueDestination=(Destination) context.getBean("queueDestination");
- jmsTemplate.send(queueDestination, new MessageCreator(){
- @Override
- public Message createMessage(Session session) throws JMSException {
- return session.createTextMessage("Hello spring JMS");
- }
- });
- }
- }
消费者:
- package com.jalja.org.jms.spring;
- import javax.jms.Destination;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import org.springframework.jms.core.JmsTemplate;
- public class SpringJmsReceive {
- public static void main(String[] args) {
- ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
- JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
- Destination queueDestination=(Destination) context.getBean("queueDestination");
- String msg=(String) jmsTemplate.receiveAndConvert(queueDestination);
- System.out.println(msg);
- }
- }
二、PTP的异步调用
我们在spring中直接配置异步接收消息的监听器,这样就相当于在spring中配置了消费者,在接受消息的时候就不必要启动消费者了。
spring-jms.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:jms="http://www.springframework.org/schema/jms"
- xmlns:amq="http://activemq.apache.org/schema/core"
- xsi:schemaLocation="http://activemq.apache.org/schema/core
- http://activemq.apache.org/schema/core/activemq-core.xsd
- http://www.springframework.org/schema/jms
- http://www.springframework.org/schema/jms/spring-jms.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd">
- <!-- ActiveMQConnectionFactory就是JMS中负责创建到ActiveMQ连接的工厂类 -->
- <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" >
- <property name="brokerURL" value="tcp://192.168.0.224:61616"/>
- </bean>
- <!-- 创建连接池 -->
- <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
- <property name="connectionFactory" ref="connectionFactory"/>
- <property name="maxConnections" value="10"/>
- </bean>
- <!-- Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory -->
- <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
- <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>
- </bean>
- <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
- <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
- <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
- <property name="connectionFactory" ref="cachingConnectionFactory"/>
- </bean>
- <!--这个是队列目的地,点对点的-->
- <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
- <constructor-arg index="0" value="spring-queue"/>
- </bean>
- <!-- 消息监听器 -->
- <bean id="myMessageListener" class="com.jalja.org.jms.spring.yb.MyMessageListener"/>
- <!-- 消息监听容器 -->
- <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <property name="connectionFactory" ref="cachingConnectionFactory" />
- <property name="destination" ref="queueDestination" />
- <property name="messageListener" ref="myMessageListener" />
- </bean>
- </beans>
生产者往指定目的地Destination发送消息后,接下来就是消费者对指定目的地的消息进行消费了。那么消费者是如何知道有生产者发送消息到指定目的地Destination了呢?这是通过Spring为我们封装的消息监听容器MessageListenerContainer实现的,它负责接收信息,并把接收到的信息分发给真正的MessageListener进行处理。每个消费者对应每个目的地都需要有对应的MessageListenerContainer。对于消息监听容器而言,除了要知道监听哪个目的地之外,还需要知道到哪里去监听,也就是说它还需要知道去监听哪个JMS服务器,这是通过在配置MessageConnectionFactory的时候往里面注入一个ConnectionFactory来实现的。所以我们在配置一个MessageListenerContainer的时候有三个属性必须指定,一个是表示从哪里监听的ConnectionFactory;一个是表示监听什么的Destination;一个是接收到消息以后进行消息处理的MessageListener。Spring一共为我们提供了两种类型的MessageListenerContainer,SimpleMessageListenerContainer和DefaultMessageListenerContainer。
SimpleMessageListenerContainer:SimpleMessageListenerContainer会在一开始的时候就创建一个会话session和消费者Consumer,并且会使用标准的JMS MessageConsumer.setMessageListener()方法注册监听器让JMS提供者调用监听器的回调函数。它不会动态的适应运行时需要和参与外部的事务管理。兼容性方面,它非常接近于独立的JMS规范,但一般不兼容Java EE的JMS限制。
DefaultMessageListenerContainer:在大多数情况下我们还是使用的DefaultMessageListenerContainer,跟SimpleMessageListenerContainer相比,DefaultMessageListenerContainer会动态的适应运行时需要,并且能够参与外部的事务管理。它很好的平衡了对JMS提供者要求低、先进功能如事务参与和兼容Java EE环境。
消息生产者:
- public static void main(String[] args) {
- ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
- JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
- Destination queueDestination=(Destination) context.getBean("queueDestination");
- System.out.println("异步调用执行开始");
- jmsTemplate.send(queueDestination, new MessageCreator(){
- @Override
- public Message createMessage(Session session) throws JMSException {
- return session.createTextMessage("Hello spring JMS");
- }
- });
- System.out.println("异步调用执行结束");
- }
消息监听器:MyMessageListener
- public class MyMessageListener implements MessageListener{
- @Override
- public void onMessage(Message message) {
- TextMessage msg= (TextMessage) message;
- try {
- System.out.println("你好:"+msg.getText());
- } catch (JMSException e) {
- e.printStackTrace();
- }
- }
- }
启动消息生产者 监听器的执行结果是:
- 异步调用执行开始
- 异步调用执行结束
- 你好:Hello spring JMS
三、发布订阅 同步接收
spring-jms.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:jms="http://www.springframework.org/schema/jms"
- xmlns:amq="http://activemq.apache.org/schema/core"
- xsi:schemaLocation="http://activemq.apache.org/schema/core
- http://activemq.apache.org/schema/core/activemq-core.xsd
- http://www.springframework.org/schema/jms
- http://www.springframework.org/schema/jms/spring-jms.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd">
- <!-- ActiveMQConnectionFactory就是JMS中负责创建到ActiveMQ连接的工厂类 -->
- <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" >
- <property name="brokerURL" value="tcp://192.168.0.224:61616"/>
- </bean>
- <!-- 创建连接池 -->
- <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
- <property name="connectionFactory" ref="connectionFactory"/>
- <property name="maxConnections" value="10"/>
- </bean>
- <!-- Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory -->
- <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
- <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>
- </bean>
- <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
- <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
- <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
- <property name="connectionFactory" ref="cachingConnectionFactory"/>
- </bean>
- <!--这个是队列目的地,发布订阅-->
- <bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
- <constructor-arg index="0" value="spring-Topic"/>
- </bean>
- </beans>
生产者:
- public static void main(String[] args) {
- ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
- JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
- Destination topicDestination=(Destination) context.getBean("topicDestination");
- jmsTemplate.send(topicDestination, new MessageCreator(){
- @Override
- public Message createMessage(Session session) throws JMSException {
- return session.createTextMessage("Hello spring JMS topicDestination");
- }
- });
- }
消费者:
- public class SpringJmsSubscriber {
- public static void main(String[] args) {
- ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
- JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
- Destination topicDestination=(Destination) context.getBean("topicDestination");
- String msg=(String) jmsTemplate.receiveAndConvert(topicDestination);
- System.out.println(msg);
- }
- }
JMS 之 Active MQ 的spring整合的更多相关文章
- JMS 之 Active MQ 启动嵌入式Broke
一.如何启动active MQ 服务 (一).使用命令启动 /bin 目录下 ./activemq start 默认使用conf/activemq.xml 配置文件 b.[root@localhost ...
- JMS 之 Active MQ 的消息传输
本文使用Active MQ5.6 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker,客户端与Active ...
- JMS 之 Active MQ 消息存储
一.消息的存储方式 ActiveMQ支持JMS规范中的持久化消息与非持久化消息 持久化消息通常用于不管是否消费者在线,它们都会保证消息会被消费者消费.当消息被确认消费后,会从存储中删除 非持久化消息通 ...
- JMS 之 Active MQ的安全机制
一.认证 认证(Authentication):验证某个实体或者用户是否有权限访问受保护资源. MQ提供两种插件用于权限认证:(一).Simple authentication plug-in:直接把 ...
- 消息中间件ActiveMQ及Spring整合JMS
一 .消息中间件的基本介绍 1.1 消息中间件 1.1.1 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排 ...
- spring整合MQ
---恢复内容开始--- 一. 导入依赖 <dependencies> <!-- ActiveMQ客户端完整jar包依赖 --> <dependency> < ...
- Spring整合JMS(一)——基于ActiveMQ实现
1.1 JMS简介 JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到 ...
- spring整合JMS - 基于ActiveMQ实现
一. 开篇语 继上一篇apache ActiveMQ之初体验后, 由于近期一直在复习spring的东西, 所以本文就使用spring整合下JMS. 二. 环境准备 1. ActiveMQ5.2.0 ( ...
- Spring整合JMS(四)——事务管理
原文链接:http://haohaoxuexi.iteye.com/blog/1983532 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFact ...
随机推荐
- 确保nginx安全的10个技巧
Nginx是当今最流行的Web服务器之一.它为世界上7%的web流量提供服务而且正在以惊人的速度增长.它是个让人惊奇的服务器,我愿意部署它. 下面是一个常见安全陷阱和解决方案的列表,它可以辅助来确保你 ...
- java根据特定密钥对字符串进行加解密
package com.test; import java.io.IOException; import java.security.SecureRandom; import javax.crypto ...
- 列表的使用2,深COPY和浅COPY,循环列表,步长切片
name2=names.copy() 下面我看几种奇怪的现象: 首先把源列表copy以后,把源列表第2个数值修改.那么没毛病. 如果源列表里,还包含了一个子列表:这也没毛病 如果我们这个时候修改子列表 ...
- Linux文件属性,类型,ls -lhi解释行列
Linux文件属性(描述信息) -i inode节点号 -h 人类可读 ls -lhi 1703938 drwxr-xr-x 2 rsync rsync 4.0K Jun 7 07:24 gamese ...
- oracle 监听静态注册举例解析
网上有很多关于oracle 监听静态注册的文章,但大多都是简单说说,并没有详细的例子,这里,将结合linux as3 下的oracle 10gR2.0.1 举一个具体的例子 1.在 $ORACLE_H ...
- 深入理解ceph-disk运行机制
谷忠言 一,背景 目前项目所用的ceph集群内部的一个节点, 一般需要管理大约十块硬盘左右的数据存储空间,外加一到两块ssd组成的journal空间.Ceph要求每个osd对应的数据盘挂载到特定的目录 ...
- 由于安装Android设备驱动异常,ADB无法识别安卓设备的解决方案
体验更优排版请移步原文:http://blog.kwin.wang/programming/android-driver-exception-solution.html 最近换了台新电脑,在Andro ...
- js给kindeditor添加值
需求:在点击回复按钮时,在kindeditor中添加被回复的用户昵称 html:<textarea name="content" id="mycontent&quo ...
- centos 和KVM安装
- GitHub从注册到使用
GitHub是最流行的代码库,里面存储着丰富的优秀的开源代码,不仅如此,作为一款免费的代码存储利器也是很牛逼,支持各种编程语言,代码显示效果堪称完美,可以随时随地查看自己记录的笔记 GitHub的好处 ...