一、与spring整合实现ptp的同步接收消息

pom.xml:

  1. <!-- https://mvnrepository.com/artifact/org.springframework/spring-jms -->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-jms</artifactId>
  5. <version>4.3.7.RELEASE</version>
  6. </dependency>
  7. <!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-pool -->
  8. <dependency>
  9. <groupId>org.apache.activemq</groupId>
  10. <artifactId>activemq-pool</artifactId>
  11. <version>5.9.0</version>
  12. </dependency>

spring-jms.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:jms="http://www.springframework.org/schema/jms"
  5. xmlns:amq="http://activemq.apache.org/schema/core"
  6. xsi:schemaLocation="http://activemq.apache.org/schema/core
  7. http://activemq.apache.org/schema/core/activemq-core.xsd
  8. http://www.springframework.org/schema/jms
  9. http://www.springframework.org/schema/jms/spring-jms.xsd
  10. http://www.springframework.org/schema/beans
  11. http://www.springframework.org/schema/beans/spring-beans.xsd">
  12.  
  13. <!-- ActiveMQConnectionFactory就是JMS中负责创建到ActiveMQ连接的工厂类 -->
  14. <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" >
  15. <property name="brokerURL" value="tcp://192.168.0.224:61616"/>
  16. </bean>
  17. <!-- 创建连接池 -->
  18. <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
  19. <property name="connectionFactory" ref="connectionFactory"/>
  20. <property name="maxConnections" value="10"/>
  21. </bean>
  22. <!-- Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory -->
  23. <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
  24. <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>
  25. </bean>
  26.  
  27. <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
  28. <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  29. <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
  30. <property name="connectionFactory" ref="cachingConnectionFactory"/>
  31. </bean>
  32.  
  33. <!--这个是队列目的地,点对点的-->
  34. <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
  35. <constructor-arg index="0" value="spring-queue"/>
  36. </bean>
  37.  
  38. </beans>

ConnectionFactory是用于产生到JMS服务器的链接的,Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory。SingleConnectionFactory对于建立JMS服务器链接的请求会一直返回同一个链接,并且会忽略Connection的close方法调用。CachingConnectionFactory继承了SingleConnectionFactory,所以它拥有SingleConnectionFactory的所有功能,同时它还新增了缓存功能,它可以缓存Session、MessageProducer和MessageConsumer。这里我们使用CachingConnectionFactory来作为示例。

消息生产者:

  1. package com.jalja.org.jms.spring;
  2.  
  3. import javax.jms.Destination;
  4. import javax.jms.JMSException;
  5. import javax.jms.Message;
  6. import javax.jms.Session;
  7.  
  8. import org.springframework.context.ApplicationContext;
  9. import org.springframework.context.support.ClassPathXmlApplicationContext;
  10. import org.springframework.jms.core.JmsTemplate;
  11. import org.springframework.jms.core.MessageCreator;
  12.  
  13. public class SpringJmsSend {
  14. public static void main(String[] args) {
  15. ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
  16. JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
  17. Destination queueDestination=(Destination) context.getBean("queueDestination");
  18. jmsTemplate.send(queueDestination, new MessageCreator(){
  19. @Override
  20. public Message createMessage(Session session) throws JMSException {
  21. return session.createTextMessage("Hello spring JMS");
  22. }
  23. });
  24. }
  25. }

消费者:

  1. package com.jalja.org.jms.spring;
  2.  
  3. import javax.jms.Destination;
  4.  
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. import org.springframework.jms.core.JmsTemplate;
  8.  
  9. public class SpringJmsReceive {
  10. public static void main(String[] args) {
  11. ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
  12. JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
  13. Destination queueDestination=(Destination) context.getBean("queueDestination");
  14. String msg=(String) jmsTemplate.receiveAndConvert(queueDestination);
  15. System.out.println(msg);
  16.   }
  17. }

二、PTP的异步调用

我们在spring中直接配置异步接收消息的监听器,这样就相当于在spring中配置了消费者,在接受消息的时候就不必要启动消费者了。

spring-jms.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:jms="http://www.springframework.org/schema/jms"
  5. xmlns:amq="http://activemq.apache.org/schema/core"
  6. xsi:schemaLocation="http://activemq.apache.org/schema/core
  7. http://activemq.apache.org/schema/core/activemq-core.xsd
  8. http://www.springframework.org/schema/jms
  9. http://www.springframework.org/schema/jms/spring-jms.xsd
  10. http://www.springframework.org/schema/beans
  11. http://www.springframework.org/schema/beans/spring-beans.xsd">
  12.  
  13. <!-- ActiveMQConnectionFactory就是JMS中负责创建到ActiveMQ连接的工厂类 -->
  14. <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" >
  15. <property name="brokerURL" value="tcp://192.168.0.224:61616"/>
  16. </bean>
  17. <!-- 创建连接池 -->
  18. <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
  19. <property name="connectionFactory" ref="connectionFactory"/>
  20. <property name="maxConnections" value="10"/>
  21. </bean>
  22. <!-- Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory -->
  23. <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
  24. <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>
  25. </bean>
  26.  
  27. <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
  28. <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  29. <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
  30. <property name="connectionFactory" ref="cachingConnectionFactory"/>
  31. </bean>
  32.  
  33. <!--这个是队列目的地,点对点的-->
  34. <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
  35. <constructor-arg index="0" value="spring-queue"/>
  36. </bean>
  37.  
  38. <!-- 消息监听器 -->
  39. <bean id="myMessageListener" class="com.jalja.org.jms.spring.yb.MyMessageListener"/>
  40.  
  41. <!-- 消息监听容器 -->
  42. <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  43. <property name="connectionFactory" ref="cachingConnectionFactory" />
  44. <property name="destination" ref="queueDestination" />
  45. <property name="messageListener" ref="myMessageListener" />
  46. </bean>
  47. </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环境。

消息生产者:

  1. public static void main(String[] args) {
  2. ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
  3. JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
  4. Destination queueDestination=(Destination) context.getBean("queueDestination");
  5. System.out.println("异步调用执行开始");
  6. jmsTemplate.send(queueDestination, new MessageCreator(){
  7. @Override
  8. public Message createMessage(Session session) throws JMSException {
  9. return session.createTextMessage("Hello spring JMS");
  10. }
  11. });
  12. System.out.println("异步调用执行结束");
  13. }

消息监听器:MyMessageListener

  1. public class MyMessageListener implements MessageListener{
  2. @Override
  3. public void onMessage(Message message) {
  4. TextMessage msg= (TextMessage) message;
  5. try {
  6. System.out.println("你好:"+msg.getText());
  7. } catch (JMSException e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. }

启动消息生产者  监听器的执行结果是:

  1. 异步调用执行开始
  2. 异步调用执行结束
  3. 你好:Hello spring JMS

三、发布订阅 同步接收

spring-jms.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:jms="http://www.springframework.org/schema/jms"
  5. xmlns:amq="http://activemq.apache.org/schema/core"
  6. xsi:schemaLocation="http://activemq.apache.org/schema/core
  7. http://activemq.apache.org/schema/core/activemq-core.xsd
  8. http://www.springframework.org/schema/jms
  9. http://www.springframework.org/schema/jms/spring-jms.xsd
  10. http://www.springframework.org/schema/beans
  11. http://www.springframework.org/schema/beans/spring-beans.xsd">
  12.  
  13. <!-- ActiveMQConnectionFactory就是JMS中负责创建到ActiveMQ连接的工厂类 -->
  14. <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory" >
  15. <property name="brokerURL" value="tcp://192.168.0.224:61616"/>
  16. </bean>
  17. <!-- 创建连接池 -->
  18. <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
  19. <property name="connectionFactory" ref="connectionFactory"/>
  20. <property name="maxConnections" value="10"/>
  21. </bean>
  22. <!-- Spring为我们提供了多个ConnectionFactory,有SingleConnectionFactory和CachingConnectionFactory -->
  23. <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
  24. <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>
  25. </bean>
  26.  
  27. <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
  28. <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  29. <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
  30. <property name="connectionFactory" ref="cachingConnectionFactory"/>
  31. </bean>
  32.  
  33. <!--这个是队列目的地,发布订阅-->
  34. <bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
  35. <constructor-arg index="0" value="spring-Topic"/>
  36. </bean>
  37. </beans>

生产者:

  1. public static void main(String[] args) {
  2. ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
  3. JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
  4. Destination topicDestination=(Destination) context.getBean("topicDestination");
  5. jmsTemplate.send(topicDestination, new MessageCreator(){
  6. @Override
  7. public Message createMessage(Session session) throws JMSException {
  8. return session.createTextMessage("Hello spring JMS topicDestination");
  9. }
  10. });
  11. }

消费者:

  1. public class SpringJmsSubscriber {
  2. public static void main(String[] args) {
  3. ApplicationContext context=new ClassPathXmlApplicationContext("spring-jms.xml");
  4. JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
  5. Destination topicDestination=(Destination) context.getBean("topicDestination");
  6. String msg=(String) jmsTemplate.receiveAndConvert(topicDestination);
  7. System.out.println(msg);
  8. }
  9. }

JMS 之 Active MQ 的spring整合的更多相关文章

  1. JMS 之 Active MQ 启动嵌入式Broke

    一.如何启动active MQ 服务 (一).使用命令启动 /bin 目录下 ./activemq start 默认使用conf/activemq.xml 配置文件 b.[root@localhost ...

  2. JMS 之 Active MQ 的消息传输

    本文使用Active MQ5.6 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker,客户端与Active ...

  3. JMS 之 Active MQ 消息存储

    一.消息的存储方式 ActiveMQ支持JMS规范中的持久化消息与非持久化消息 持久化消息通常用于不管是否消费者在线,它们都会保证消息会被消费者消费.当消息被确认消费后,会从存储中删除 非持久化消息通 ...

  4. JMS 之 Active MQ的安全机制

    一.认证 认证(Authentication):验证某个实体或者用户是否有权限访问受保护资源. MQ提供两种插件用于权限认证:(一).Simple authentication plug-in:直接把 ...

  5. 消息中间件ActiveMQ及Spring整合JMS

    一 .消息中间件的基本介绍 1.1 消息中间件 1.1.1 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排 ...

  6. spring整合MQ

    ---恢复内容开始--- 一. 导入依赖 <dependencies> <!-- ActiveMQ客户端完整jar包依赖 --> <dependency> < ...

  7. Spring整合JMS(一)——基于ActiveMQ实现

    1.1     JMS简介 JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到 ...

  8. spring整合JMS - 基于ActiveMQ实现

    一. 开篇语 继上一篇apache ActiveMQ之初体验后, 由于近期一直在复习spring的东西, 所以本文就使用spring整合下JMS. 二. 环境准备 1. ActiveMQ5.2.0 ( ...

  9. Spring整合JMS(四)——事务管理

    原文链接:http://haohaoxuexi.iteye.com/blog/1983532 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFact ...

随机推荐

  1. 确保nginx安全的10个技巧

    Nginx是当今最流行的Web服务器之一.它为世界上7%的web流量提供服务而且正在以惊人的速度增长.它是个让人惊奇的服务器,我愿意部署它. 下面是一个常见安全陷阱和解决方案的列表,它可以辅助来确保你 ...

  2. java根据特定密钥对字符串进行加解密

    package com.test; import java.io.IOException; import java.security.SecureRandom; import javax.crypto ...

  3. 列表的使用2,深COPY和浅COPY,循环列表,步长切片

    name2=names.copy() 下面我看几种奇怪的现象: 首先把源列表copy以后,把源列表第2个数值修改.那么没毛病. 如果源列表里,还包含了一个子列表:这也没毛病 如果我们这个时候修改子列表 ...

  4. Linux文件属性,类型,ls -lhi解释行列

    Linux文件属性(描述信息) -i inode节点号 -h 人类可读 ls -lhi 1703938 drwxr-xr-x 2 rsync rsync 4.0K Jun 7 07:24 gamese ...

  5. oracle 监听静态注册举例解析

    网上有很多关于oracle 监听静态注册的文章,但大多都是简单说说,并没有详细的例子,这里,将结合linux as3 下的oracle 10gR2.0.1 举一个具体的例子 1.在 $ORACLE_H ...

  6. 深入理解ceph-disk运行机制

    谷忠言 一,背景 目前项目所用的ceph集群内部的一个节点, 一般需要管理大约十块硬盘左右的数据存储空间,外加一到两块ssd组成的journal空间.Ceph要求每个osd对应的数据盘挂载到特定的目录 ...

  7. 由于安装Android设备驱动异常,ADB无法识别安卓设备的解决方案

    体验更优排版请移步原文:http://blog.kwin.wang/programming/android-driver-exception-solution.html 最近换了台新电脑,在Andro ...

  8. js给kindeditor添加值

    需求:在点击回复按钮时,在kindeditor中添加被回复的用户昵称 html:<textarea name="content" id="mycontent&quo ...

  9. centos 和KVM安装

  10. GitHub从注册到使用

    GitHub是最流行的代码库,里面存储着丰富的优秀的开源代码,不仅如此,作为一款免费的代码存储利器也是很牛逼,支持各种编程语言,代码显示效果堪称完美,可以随时随地查看自己记录的笔记 GitHub的好处 ...