zoukankan      html  css  js  c++  java
  • 消息中间件ActiveMQ及Spring整合JMS

    一 、消息中间件的基本介绍

    1.1 消息中间件

    1.1.1 什么是消息中间件

    消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有Producer(生产者)、Consumer(消费者)

    常见的消息中间件产品:

    1ActiveMQ

    ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。这里介绍的是ActiveMQ的使用。

    (2)RabbitMQ

    AMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用。

    (3)ZeroMQ

    史上最快的消息队列系统

    (4)Kafka

    Apache下的一个子项目 。特点:高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统。适合处理海量数据。

    1.1.2 使用ActiveMQ的场景

    1. 进程间通讯,比如在分布式系统中。

    2. 解耦,比如像我们公司有许多开发团队,每个团队负责业务的不同模块,各个开发团队可以使用MQ来通信。

    3. 在一些高并发场景下,使用MQ的异步特性。

    4. (欢迎补充)

     1.2 JMS简介

    1.2.1什么是JMS

      JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。

           JMS本身只定义了一系列的接口规范,是一种与厂商无关的 API,用来访问消息收发系统。它类似于 JDBC(Java Database Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JML 客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。

    JMS 定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一

    些不同形式的数据,提供现有消息格式的一些级别的兼容性。

    · TextMessage--一个字符串对象

    · MapMessage--一套名称-值对

    · ObjectMessage--一个序列化的 Java 对象

    · BytesMessage--一个字节的数据流

    · StreamMessage -- Java 原始值的数据流

    1.2.2 JMS消息传递类型

    对于消息的传递有两种类型:

    一种是点对点的,即一个生产者和一个消费者一一对应;

    另一种是发布//订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。

    1.3ActiveMQ下载与安装

    1.3.1下载

    官方网站下载:http://activemq.apache.org/

    1.3.2安装(Linux)

    (1)将apache-activemq-5.12.0-bin.tar.gz 上传至服务器【将安装包移动到所有软件安装目录(个人习惯)  /export/software】

    (2)解压此文件

    1 tar  -zxvf  apache-activemq-5.12.0-bin.tar.gz -C /export/servers

    (3)为apache-activemq-5.12.0目录赋权

    1 chmod 777 apache-activemq-5.12.0

    (4)进入apache-activemq-5.12.0\bin目录

    (5)赋与执行权限

    1 chmod 755 activemq 

    Linux下赋值权限的介绍:

     1 linux 命令chmod 755的意思
     2 chmod是Linux下设置文件权限的命令,后面的数字表示不同用户或用户组的权限。
     3 一般是三个数字:
     4 第一个数字表示文件所有者的权限
     5 第二个数字表示与文件所有者同属一个用户组的其他用户的权限
     6 第三个数字表示其它用户组的权限。
     7       权限分为三种:读(r=4),写(w=2),执行(x=1) 。 综合起来还有可读可执行(rx=5=4+1)、可读可写(rw=6=4+2)、可读可写可执行(rwx=7=4+2+1)。
     8       所以,chmod 755 设置用户的权限为: 
     9 1.文件所有者可读可写可执行                                    --7
    10 2.与文件所有者同属一个用户组的其他用户可读可执行 --5 
    11 3.其它用户组可读可执行                                          --5
    View Code

    1.3.3启动

    1  ./activemq start

    出现下列提示表示成功!

     

    我的服务器地址是192.168.75.14,打开浏览器输入地址http://192.168.75.14:8161/ 即可进入ActiveMQ管理页面

    点击进入管理页面

    输入用户名和密码  均为 admin 

    进入主界面

    点击进入消息列表:

    列表各列信息含义如下:

    Number Of Pending Messages  等待消费的消息 这个是当前未出队列的数量。

    Number Of Consumers  消费者 这个是消费者端的消费者数量

    Messages Enqueued  进入队列的消息  进入队列的总数量,包括出队列的。

    Messages Dequeued  出了队列的消息  可以理解为是消费这消费掉的数量。

    2. JMS入门小Demo

    2.1点对点模式

    点对点的模式主要建立在一个队列上面,当连接一个列队的时候,发送端不需要知道接收端是否正在接收,可以直接向ActiveMQ发送消息,发送的消息,将会先进入队列中,如果有接收端在监听,则会发向接收端,如果没有接收端接收,则会保存在activemq服务器,直到接收端接收消息,点对点的消息模式可以有多个发送端,多个接收端,但是一条消息,只会被一个接收端给接收到,哪个接收端先连上ActiveMQ,则会先接收到,而后来的接收端则接收不到那条消息。

    2.1.1消息生产者

    (1)创建工程jmsDemo ,引入依赖

         <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-client</artifactId>
            <version>5.13.4</version>
         </dependency>
    View Code

    (2)创建类QueueProducer  main方法代码如下:

     1 //1.创建连接工厂
     2         ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.75.14:61616");
     3         //2.获取连接
     4         Connection connection = connectionFactory.createConnection();
     5         //3.启动连接
     6         connection.start();
     7         //4.获取session(参数1:是否启动事务,参数2:消息确认模式)
     8         Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
     9         //5.创建队列对象
    10         Queue queue = session.createQueue("test-queue");
    11         //6.创建消息生产者
    12         MessageProducer producer = session.createProducer(queue);
    13         //7.创建消息
    14         TextMessage textMessage = session.createTextMessage("欢迎来到activeMQ的世界!");
    15         //8.发送消息
    16         producer.send(textMessage);
    17         //9.关闭资源
    18         producer.close();
    19         session.close();
    20         connection.close();
    View Code

    上述代码中第4步创建session  的两个参数:

    第1个参数 是否使用事务

    第2个参数 消息的确认模式

    • AUTO_ACKNOWLEDGE = 1    自动确认
    • CLIENT_ACKNOWLEDGE = 2    客户端手动确认   
    • DUPS_OK_ACKNOWLEDGE = 3    自动批量确认
    • SESSION_TRANSACTED = 0    事务提交并确认

     运行后通过ActiveMQ管理界面查询

    2.1.2消息消费者

    创建类QueueConsumer ,main方法代码如下:

     1 //1.创建连接工厂
     2         ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.75.14:61616");
     3         //2.获取连接
     4         Connection connection = connectionFactory.createConnection();
     5         //3.启动连接
     6         connection.start();
     7         //4.获取session(参数1:是否启动事务,参数2:消息确认模式)
     8         Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
     9         //5.创建队列对象
    10         Queue queue = session.createQueue("test-queue");
    11         //6.创建消息消费
    12         MessageConsumer consumer = session.createConsumer(queue);
    13         //7.监听消息
    14         consumer.setMessageListener(new MessageListener() {
    15             
    16             public void onMessage(Message message) {
    17                 TextMessage textMessage = (TextMessage) message;
    18                 try {
    19                     System.out.println("接收到消息:"+textMessage.getText());
    20                 } catch (JMSException e) {
    21                     e.printStackTrace();
    22                 }
    23             }
    24         });
    25         //8.等待键盘输入
    26         System.in.read();    
    27         //9.关闭资源
    28         consumer.close();
    29         session.close();
    30         connection.close();
    31     }
    View Code

    执行后看到控制台输出

    2.1.3运行测试

    同时开启2个以上的消费者,再次运行生产者,观察每个消费者控制台的输出,会发现只有一个消费者会接收到消息。

    2.2 发布/订阅模式

    2.2.1消息生产者

    创建类TopicProducer ,main方法代码如下:

     1 //1.创建连接工厂
     2         ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.75.14:61616");
     3         //2.获取连接
     4         Connection connection = connectionFactory.createConnection();
     5         //3.启动连接
     6         connection.start();
     7         //4.获取session  (参数1:是否启动事务,参数2:消息确认模式)
     8         Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
     9         //5.创建主题对象
    10         Topic topic = session.createTopic("test-topic");
    11         //6.创建消息生产者
    12         MessageProducer producer = session.createProducer(topic);
    13         //7.创建消息
    14         TextMessage textMessage = session.createTextMessage("欢迎来到神奇的activeMQ世界");
    15         //8.发送消息
    16         producer.send(textMessage);
    17         //9.关闭资源
    18         producer.close();
    19         session.close();
    20         connection.close();
    21     }
    View Code

    运行效果如下:

    2.2.2消息消费者

    创建类TopicConsumer ,main方法代码如下:

     1 //1.创建连接工厂
     2         ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.75.14:61616");
     3         //2.获取连接
     4         Connection connection = connectionFactory.createConnection();
     5         //3.启动连接
     6         connection.start();
     7         //4.获取session  (参数1:是否启动事务,参数2:消息确认模式)
     8         Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
     9         //5.创建主题对象
    10         //Queue queue = session.createQueue("test-queue");
    11         Topic topic = session.createTopic("test-topic");
    12         //6.创建消息消费
    13         MessageConsumer consumer = session.createConsumer(topic);
    14         
    15         //7.监听消息
    16         consumer.setMessageListener(new MessageListener() {
    17             public void onMessage(Message message) {
    18                 TextMessage textMessage=(TextMessage)message;
    19                 try {
    20                     System.out.println("接收到消息:"+textMessage.getText());
    21                 } catch (JMSException e) {
    22                     // TODO Auto-generated catch block
    23                     e.printStackTrace();
    24                 }
    25             }
    26         });
    27         //8.等待键盘输入
    28         System.in.read();
    29         //9.关闭资源
    30         consumer.close();
    31         session.close();
    32         connection.close();
    33     }
    View Code

    2.2.3运行测试

    同时开启2个以上的消费者,再次运行生产者,观察每个消费者控制台的输出,会发现每个消费者会接收到消息。

    3.Spring整合JMS

    3.1 点对点模式

    3.1.1消息生产者

    (1)创建工程springjms_producer,在POM文件中引入SpringJms 、activeMQ以及单元测试相关依赖 

     1 <dependencies>
     2           <dependency>
     3             <groupId>org.apache.activemq</groupId>
     4             <artifactId>activemq-client</artifactId>
     5             <version>5.13.4</version>
     6          </dependency>
     7           <dependency>
     8             <groupId>org.springframework</groupId>
     9             <artifactId>spring-jms</artifactId>    
    10             <version>4.3.2.RELEASE</version>    
    11         </dependency>
    12           <dependency>
    13             <groupId>org.springframework</groupId>
    14             <artifactId>spring-test</artifactId>
    15             <version>4.2.4.RELEASE</version>    
    16         </dependency>
    17         <dependency>
    18             <groupId>junit</groupId>
    19             <artifactId>junit</artifactId>
    20             <version>4.9</version>
    21         </dependency>
    22   </dependencies>
    View Code

    (2)在src/main/resources下创建spring配置文件(先创建spring文件夹)applicationContext-jms-producer.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:p="http://www.springframework.org/schema/p"
     5     xmlns:context="http://www.springframework.org/schema/context"
     6     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 
     7     xmlns:mvc="http://www.springframework.org/schema/mvc"
     8     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     9         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
    10         http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
    11         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    12     
    13    <context:component-scan base-package="com.yida.demo"></context:component-scan>        
    14     <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->  
    15     <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
    16         <property name="brokerURL" value="tcp://192.168.75.14:61616"/>  
    17     </bean>          
    18     <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->  
    19     <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">  
    20     <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->  
    21         <property name="targetConnectionFactory" ref="targetConnectionFactory"/>  
    22     </bean>         
    23     <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->  
    24     <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
    25         <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  
    26         <property name="connectionFactory" ref="connectionFactory"/>  
    27     </bean>      
    28     <!--这个是队列目的地,点对点的  文本信息-->  
    29     <bean id="queueTextDestination" class="org.apache.activemq.command.ActiveMQQueue">  
    30         <constructor-arg value="queue_text"/>  
    31     </bean>  
    32        
    33 
    34 </beans>
    View Code

    (3)在com.yida.demo包下创建消息生产者类

     1 @Component
     2 public class QueueProducer {
     3     
     4     @Autowired
     5     private JmsTemplate jmsTemplate;
     6     
     7     @Autowired
     8     private Destination queueTextDestination;//配置文件applicationContext-jms-producer.xml点对点文本信息bean的id
     9     
    10     /**
    11      * 发送文本消息
    12      * @param text
    13      */
    14     public void sendTextMessage(final String text){
    15         jmsTemplate.send(queueTextDestination, new MessageCreator() {
    16             
    17             public Message createMessage(Session session) throws JMSException {
    18                 return session.createTextMessage(text);
    19             }
    20         });
    21     }
    22     
    23 }
    View Code

    (4)单元测试

    在src/test/java创建测试类

     1 @RunWith(SpringJUnit4ClassRunner.class)
     2 @ContextConfiguration(locations="classpath:spring/applicationContext-jms-producer.xml")
     3 public class TestQueue {
     4     @Autowired
     5     private QueueProducer queueProducer;
     6     
     7     @Test
     8     public void testSend(){
     9         queueProducer.sendTextMessage("SpringJms-点对点");
    10     }
    11 }
    View Code

    3.1.2消息消费者

    (1)创建工程springjms_consumer,在POM文件中引入依赖 (同上一个工程)

    (2)创建配置文件 applicationContext-jms-consumer-queue.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:p="http://www.springframework.org/schema/p"
     5     xmlns:context="http://www.springframework.org/schema/context"
     6     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 
     7     xmlns:mvc="http://www.springframework.org/schema/mvc"
     8     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     9         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
    10         http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
    11         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    12     
    13    <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->  
    14     <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
    15         <property name="brokerURL" value="tcp://192.168.75.14:61616"/>  
    16     </bean>       
    17     <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->  
    18     <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">  
    19     <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->  
    20         <property name="targetConnectionFactory" ref="targetConnectionFactory"/>  
    21     </bean>      
    22     <!--这个是队列目的地,点对点的  文本信息-->  
    23     <bean id="queueTextDestination" class="org.apache.activemq.command.ActiveMQQueue">  
    24         <constructor-arg value="queue_text"/>  
    25     </bean>    
    26     <!-- 我的监听类 -->
    27     <bean id="myMessageListener" class="com.yida.demo.MyMessageListener"></bean>
    28     <!-- 消息监听容器 -->
    29     <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    30         <property name="connectionFactory" ref="connectionFactory" />
    31         <property name="destination" ref="queueTextDestination" />
    32         <property name="messageListener" ref="myMessageListener" />
    33     </bean>    
    34    
    35        
    36 
    37 </beans>
    View Code

    (3)编写监听类

     1 public class MyMessageListener implements MessageListener {
     2 
     3     public void onMessage(Message message) {
     4         TextMessage textMessage=(TextMessage)message;        
     5         try {
     6             System.out.println("接收到消息:"+textMessage.getText());
     7         } catch (JMSException e) {
     8             e.printStackTrace();
     9         }
    10     }
    11 }
    View Code

    (4)创建测试类

     1 @RunWith(SpringJUnit4ClassRunner.class)
     2 @ContextConfiguration(locations="classpath:spring/applicationContext-jms-consumer-queue.xml")
     3 public class TestQueue {
     4     @Test
     5     public void testQueue(){
     6         try {
     7             System.in.read();
     8         } catch (IOException e) {
     9             e.printStackTrace();
    10         }        
    11     }    
    12 }
    View Code

    3.1.3 测试结果

    先运行springjms_producer工程的生产者测试类,再运行springjms_consumer工程的测试类 ,控制台打印如下:

    3.2发布/订阅模式

    3.2.1消息生产者

    (1)在工程springjms_producer的applicationContext-jms-producer.xml增加配置

    1     <!--这个是订阅模式  文本信息-->  
    2     <bean id="topicTextDestination" class="org.apache.activemq.command.ActiveMQTopic">  
    3         <constructor-arg value="topic_text"/>  
    4     </bean>  

    (2)创建生产者类

     1 @Component
     2 public class TopicProducer {
     3     @Autowired
     4     private JmsTemplate jmsTemplate;
     5     
     6     @Autowired
     7     private Destination topicTextDestination;
     8     
     9     /**
    10      * 发送文本消息
    11      * @param text
    12      */
    13     public void sendTextMessage(final String text){
    14         jmsTemplate.send(topicTextDestination, new MessageCreator() {            
    15             public Message createMessage(Session session) throws JMSException {
    16                 return session.createTextMessage(text);
    17             }
    18         });        
    19     }
    20 }

    (3)编写测试类

     1 package springjms_producer;
     2 
     3 import org.junit.Test;
     4 import org.junit.runner.RunWith;
     5 import org.springframework.beans.factory.annotation.Autowired;
     6 import org.springframework.test.context.ContextConfiguration;
     7 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
     8 
     9 import com.yida.demo.TopicProducer;
    10 
    11 @RunWith(SpringJUnit4ClassRunner.class)
    12 @ContextConfiguration(locations="classpath:spring/applicationContext-jms-producer.xml")
    13 public class TestTopic {
    14     @Autowired
    15     private TopicProducer topicProducer;
    16     @Test
    17     public void sendTextQueue(){        
    18         topicProducer.sendTextMessage("我是发布订阅");
    19     }    
    20 }

    3.2.2消息消费者

    (1)在springjms_consumer工程中创建配置文件applicationContext-jms-consumer-topic.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:p="http://www.springframework.org/schema/p"
     5     xmlns:context="http://www.springframework.org/schema/context"
     6     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 
     7     xmlns:mvc="http://www.springframework.org/schema/mvc"
     8     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     9         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
    10         http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
    11         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    12     
    13      <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->  
    14     <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
    15         <property name="brokerURL" value="tcp://192.168.75.14:61616"/>  
    16     </bean>
    17     <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->  
    18     <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">  
    19     <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->  
    20         <property name="targetConnectionFactory" ref="targetConnectionFactory"/>  
    21     </bean>  
    22     <!--这个是队列目的地,点对点的  文本信息-->  
    23     <bean id="topicTextDestination" class="org.apache.activemq.command.ActiveMQTopic">  
    24         <constructor-arg value="topic_text"/>  
    25     </bean>    
    26     <!-- 我的监听类 -->
    27     <bean id="myMessageListener" class="com.yida.demo.MyMessageListener"></bean>
    28     <!-- 消息监听容器 -->
    29     <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    30         <property name="connectionFactory" ref="connectionFactory" />
    31         <property name="destination" ref="topicTextDestination" />
    32         <property name="messageListener" ref="myMessageListener" />
    33     </bean>
    34  
    35        
    36 
    37 </beans>

    (2)编写测试类

     1 package springjms_consumer;
     2 
     3 import java.io.IOException;
     4 
     5 import org.junit.Test;
     6 import org.junit.runner.RunWith;
     7 import org.springframework.test.context.ContextConfiguration;
     8 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
     9 
    10 @RunWith(SpringJUnit4ClassRunner.class)
    11 @ContextConfiguration(locations="classpath:spring/applicationContext-jms-consumer-topic.xml")
    12 public class TestTopic {
    13     @Test
    14     public void testTopic(){
    15         try {
    16             System.in.read();
    17         } catch (IOException e) {
    18             e.printStackTrace();
    19         }        
    20     }        
    21 }

    测试:同时运行三个消费者工程,在运行生产者工程,查看三个消费者工程的控制台输出。

  • 相关阅读:
    hdoj Last non-zero Digit in N! 【数论】
    spin_lock &amp; mutex_lock的差别?
    20140514,微软5月14日公布8个安全补丁
    教你用笔记本破解无线路由器password
    SSL工作原理
    MS-SQLSERVER中的MSDTC不可用解决方法
    grub2手动引导ubuntu
    用递归翻转一个栈 Reverse a stack using recursion
    腾讯面试
    AngularJS移动开发中的坑汇总
  • 原文地址:https://www.cnblogs.com/likemebee/p/activeMQ.html
Copyright © 2011-2022 走看看