关于ActiveMQ的一点总结

来源:互联网 发布:ipad虚拟机运行windows 编辑:程序博客网 时间:2024/04/25 00:52
  1. ActiveMQ入门  
  2. 作者:一路向北  
  3.    摘要:本文主要讲述ActiveMQ的基本知识和使用方法,并简单结合spring使用ActiveMQ。  
  4. 一、ActiveMQ特性和使用总览  
  5.    企业消息软件从80年代起就存在,它不只是一种应用间消息传递风格,也是一种集成风格。因此,消息传递可以满足应用间的通知和互相操作。但是开源的解决方案是到最近10年才出现的。Apache ActiveMQ就是其中一种。它使应用间能以异步,松耦合方式交流。本章将向您介绍ActiveMQ。  
  6.    ActiveMQ是Apache软件基金下的一个开源软件,它遵循JMS1.1规范(Java Message Service),是消息驱动中间件软件(MOM)。它为企业消息传递提供高可用,出色性能,可扩展,稳定和安全保障。ActiveMQ使用Apache许可协议。因此,任何人都可以使用和修改它而不必反馈任何改变。这对于商业上将ActiveMQ用在重要用途的人尤为关键。MOM的工作是在分布式的各应用之间调度事件和消息,使之到达指定的接收者。所以高可用,高性能,高可扩展性尤为关键。  
  7.    ActiveMQ的目标是在尽可能多的平台和语言上提供一个标准的,消息驱动的应用集成。ActiveMQ实现JMS规范并在此之上提供大量额外的特性。  
  8.    下面是一个高层次的特性列表。  
  9.    ·遵循JMS规范 ----理解ActiveMQ的起始点是明白ActiveMQ的各种特性是JMS1.1规范的实现。本章后面将讨论JMS规范提供的好处和保证。它们包括同步和异步消息传递,一次和只有一次的消息传递,对于预订者的持久消息等等。依附于JMS规范意味着,不论JMS消息提供者是谁,同样的基本特性都是有效的。  
  10.    ·连接----ActiveMQ提供各种连接选择,包括HTTP,HTTPS,IP多点传送,SSL,STOMP,TCP,UDP,XMPP等。大量的连接协议支持使之具有更好的灵活性。很多现有的系统使用一种特定协议并且不能改变,所以一个支持多种协议的消息平台降低了使用的门槛。虽然连接很重要,但是和其他容器集成也同样重要。第四章将讲解ActiveMQ的传输连接器(transport connectors)和网络连接器(network connectors)。  
  11.    ·可插拔的持久性和安全----ActiveMQ提供多种持久性方案可供选择,也可以完全按自己需求定制验证和授权。例如,ActiveMQ通过KahaDB提供自己的超快速消息持久方案(ultra-fast message persistence),但也支持标准的JDBC方案。ActiveMQ可以通过配置文件提供简单的验证和授权,也提供标准的JAAS登陆模块。  
  12.    ·用Java建立消息驱动应用----ActiveMQ最常用在Java应用中,用于发送和接收消息。这部分的内容涉及JMS规范API。  
  13.    ·与应用服务器集成----ActiveMQ与java应用服务器集成是很常见的。  
  14.    ·客户端APIs----ActiveMQ对多种语言提供客户端API,除了Java之外还有C/C++,.NET,Perl,PHP,Python,Ruby等。这使得ActiveMQ能用在Java之外的其它语言中。很多其它语言都可以通过ActiveMQ提供的客户端API使用ActiveMQ的全部特性。当然,ActiveMQ代理器(broker)仍然是运行在java虚拟机上,但是客户端能够使用其它的被支持的语言。  
  15.    ·代理器集群(Broker clustering)----为了利于扩展,多个ActiveMQ broker能够联合工作。这个方式就是network of brokers并且能支持多种拓扑结构。  
  16.    ·高级代理器特性和客户端选项----ActiveMQ为代理器和客户端连接提供很多高级的特性。ActiveMQ也可以通过代理器的XML配置文件支持Apache Camel。  
  17.    ·简单的管理----ActiveMQ是为开发者设计的。它并不需要专门的管理工具,因为它提供各种易用且强大的管理特性。有很多方法去监控ActiveMQ的各个方面,可以通过JMX使用JConsole或ActiveMQ web console;可以运行ActiveMQ消息报告;可以用命令行脚本;可以通过日志。  
  18.    用 ActiveMQ 最好还是了解下 JMS  
  19.    JMS 公共      点对点域    发布/订阅域  
  20.   ConnectionFactory   QueueConnectionFactory      TopicConnectionFactory  
  21.   Connection      QueueConnection     TopicConnection  
  22.   Destination     Queue   Topic  
  23.   Session     QueueSession    TopicSession  
  24.   MessageProducer     QueueSender     TopicPublisher  
  25.   MessageConsumer     QueueReceiver   TopicSubscriber  
  26.    JMS 定义了两种方式:Quere(点对点);Topic(发布/订阅)。  
  27.    ·ConnectionFactory 是连接工厂,负责创建Connection。  
  28.    ·Connection 负责创建 Session。  
  29.    ·Session 创建 MessageProducer(用来发消息) 和 MessageConsumer(用来接收消息)。  
  30.    ·Destination 是消息的目的地。  
  31.    详细的可以网上找些 JMS 规范(有中文版)  
  32. 二、开始使用ActiveMQ  
  33.    开始使用ActiveMQ并不难。你只要启动代理器并确保它能接受连接和发送消息。ActiveMQ有一些自带的例子。  
  34.    在这部分,你将下载和安装Java SE,下载和安装ActiveMQ,检查ActiveMQ目录,然后第一次启动ActiveMQ。所需工具包括JDK1.5+、Ant、ActiveMQ。  
  35. 1、JDK下载和安装  
  36.    ActiveMQ 要求Sun Java SE 1.5或以上。在开始这部分前,必须先安装。JDK的下载和安装就不是本文介绍重点。  
  37. 2、Ant下载和安装  
  38.    Ant可以用来构建和运行ActiveMQ自带例子。Ant可以从Apache Ant网址下载。URL: http://ant.apache.org/bindownload.cgi  
  39.    点击链接地址并选择正确的压缩包。(tar包是Linux和Unix,zip是Windows)。请按照下列地址安装Ant。URL: http://ant.apache.org/manual/install.html。确保你设置好$ANT_HOME环境变量,并将$ANT_HOME/bin放到$PATH环境变量里。安装完毕后你可以运行下面的命令查看Ant版本。  
  40.      
  41.    你的可能跟我的不太一样,使用Ant的不同版本,不过这没关系。一旦Ant输出如上信息,你就可以确定Ant都安装正确。  
  42. 3、ActiveMQ下载和安装  
  43.    ActiveMQ可以从Apache ActiveMQ网站下,URL: http://activemq.apache.org/download.html.  
  44.    点击地址到5.4.3版本,你可以看到tar和zip格式包。(tar包是Linux和Unix,zip是Windows)。下载完后解压。我的解压到了E:\tools\apache-activemq-5.4.3  
  45.    从命令行进入apache-activemq-5.4.3目录,输入如下命令。  
  46.      
  47.    LICENSE----Apache Software Foundation(ASF)要求的一个文件.包含ActiveMQ使用的所有库的许可证.  
  48.    NOTICE----ASF要求的另一个文件.包含ActiveMQ使用的所有库的版权信息.  
  49.    README.txt 一个包含一些URL的文档,使新手可以使用ActiveMQ.  
  50.    WebConsole-README.txt----包含使用ActiveMQ web console使用说明.  
  51.    activemq-all-5.4.3.jar---一个jar包包含ActiveMQ所有东西。放在这里是方便你使用它。  
  52.    bin----包含二进制或可运行文件。ActiveMQ启动脚本就放在里面。  
  53.    conf--ActiveMQ所有的配置信息。  
  54.    data--日志和持久化文件存储地方。  
  55.    docs--包含一个简单的index.html,该文件指向ActiveMQ网站。  
  56.    example----ActiveMQ例子。我们用这些例子来简单的测试ActiveMQ。  
  57.    lib----所有ActiveMQ所需库。  
  58.    user-guide.html----一个简单指引启动ActiveMQ和运行例子。  
  59.    webapps----ActiveMQ web console和一些网络演示。  
  60.    下一部分将启动ActiveMQ并用这些例子验证它。  
  61.    启动ActiveMQ  
  62.    在命令行中输入一下命令,或者直接运行bin目录下的activemq.bat文件  
  63.      
  64.    刚才的命令启动了ActiveMQ代理器和一些连接器,使得客户端可以通过一些诸如TCP,SSL,STOMP,XMPP协议连接进来。请注意现在ActiveMQ已经启动,并且客户端可以通过TCP 61616端口连接进来。最好的方法是使用ActiveMQ自带的例子来发送和接收消息。下面我们来运行第一个例子。  
  65. 4、运行ActiveMQ第一个例子  
  66.    这个例子是模拟生产者消费者的例子,生产者产生2000条信息,然后关闭,消费者消费2000信息,然后关闭。下面我们演示一下。  
  67.    重新打开一个DOS窗口,切到MQ目录的example目录下,我的是E:\tools\apache-activemq-5.4.3\example  
  68.    然后输入一下命令  
  69.      
  70.    最后一行显示程序在等待2000个message。这是一个消费者。再重新打开DOS窗口并且到MQ目录下的example目录,输入一下命令ant producer,这个是生产者。输入命令之后你回看到刚才打开的两个DOS窗口打印出一堆东西  
  71.      
  72.    看到BUILD SUCCESSFUL说明程序运行成功。  
  73.    消费者窗口变成了如下内容:  
  74.      
  75.    示例程序演示完毕,观看别人写的看着没啥意思,我们自己写一个程序,测试一下。  
  76. 三、运行自己编写的第一个例子  
  77.    我们自己编写一个跟上面类似的例子。  
  78. 1、建立web项目  
  79.    打开myeclipse,新建web项目,内容填下如下:  
  80.      
  81.    点击finish。接着在项目根目录下新建一个lib目录,然后将我们上面提及的activemq-all-5.4.3.jar拷贝至lib目录下,并将其加入项目library中如下图:  
  82.      
  83.    点击OK,项目目前的文件夹结构如下:  
  84.      
  85. 2、编写代码  
  86.    在src上右键选择新建class,具体如下:  
  87.      
  88.    点击finish。然后输入如下代码  
  89.   package com.mq;  
  90.     
  91.   import java.util.Date;  
  92.     
  93.   import javax.jms.Connection;  
  94.   import javax.jms.ConnectionFactory;  
  95.   import javax.jms.Destination;  
  96.   import javax.jms.JMSException;  
  97.   import javax.jms.MapMessage;  
  98.   import javax.jms.MessageProducer;  
  99.   import javax.jms.Session;  
  100.     
  101.   import org.apache.activemq.ActiveMQConnection;  
  102.   import org.apache.activemq.ActiveMQConnectionFactory;  
  103.     
  104.   public class Producer {  
  105.     public static void main(String[] args) {  
  106.         String user = ActiveMQConnection.DEFAULT_USER;  
  107.         String password = ActiveMQConnection.DEFAULT_PASSWORD;  
  108.         String url = ActiveMQConnection.DEFAULT_BROKER_URL;  
  109.         String subject = "TOOL.DEFAULT";  
  110.         ConnectionFactory contectionFactory = new ActiveMQConnectionFactory(user,password,url);  
  111.         try {  
  112.             Connection connection = contectionFactory.createConnection();  
  113.             connection.start();  
  114.             Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);  
  115.             Destination destination = session.createQueue(subject);  
  116.             MessageProducer producer = session.createProducer(destination);  
  117.             for(int i = 0;i<=20;i++){  
  118.                 MapMessage message = session.createMapMessage();  
  119.                 message.setLong("count", new Date().getTime());  
  120.                 Thread.sleep(1000);  
  121.                 producer.send(message);  
  122.                 System.out.println("--发送消息:"+new Date());  
  123.             }  
  124.             session.commit();  
  125.             session.close();  
  126.             connection.close();  
  127.         } catch (JMSException e) {  
  128.             e.printStackTrace();  
  129.         } catch (InterruptedException e) {  
  130.             e.printStackTrace();  
  131.         }  
  132.     }  
  133.     
  134.   }  
  135.      
  136.    然后再新建一个消费者类如下图:  
  137.      
  138.    点击finish。然后输入如下代码  
  139.   package com.mq;  
  140.     
  141.   import java.util.Date;  
  142.     
  143.   import javax.jms.Connection;  
  144.   import javax.jms.ConnectionFactory;  
  145.   import javax.jms.Destination;  
  146.   import javax.jms.JMSException;  
  147.   import javax.jms.MapMessage;  
  148.   import javax.jms.Message;  
  149.   import javax.jms.MessageConsumer;  
  150.   import javax.jms.MessageListener;  
  151.   import javax.jms.Session;  
  152.     
  153.   import org.apache.activemq.ActiveMQConnection;  
  154.   import org.apache.activemq.ActiveMQConnectionFactory;  
  155.     
  156.   public class Consumer {  
  157.     
  158.     public static void main(String[] args) {  
  159.         String user = ActiveMQConnection.DEFAULT_USER;  
  160.         String password = ActiveMQConnection.DEFAULT_PASSWORD;  
  161.         String url = ActiveMQConnection.DEFAULT_BROKER_URL;  
  162.         String subject = "TOOL.DEFAULT";  
  163.         ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user,password,url);  
  164.         Connection connection;  
  165.         try {  
  166.             connection = connectionFactory.createConnection();  
  167.             connection.start();  
  168.             final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);  
  169.             Destination destination = session.createQueue(subject);  
  170.             MessageConsumer message = session.createConsumer(destination);  
  171.             message.setMessageListener(new MessageListener(){  
  172.     
  173.                 public void onMessage(Message msg) {  
  174.                     MapMessage message = (MapMessage)msg;  
  175.                     try {  
  176.                         System.out.println("--收到消息:"+new Date(message.getLong("count")));  
  177.                         session.commit();  
  178.                     } catch (JMSException e) {  
  179.                         e.printStackTrace();  
  180.                     }  
  181.                 }  
  182.             });  
  183.             Thread.sleep(30000);  
  184.             session.close();  
  185.             connection.close();  
  186.         } catch (JMSException e) {  
  187.             e.printStackTrace();  
  188.         } catch (InterruptedException e) {  
  189.             e.printStackTrace();  
  190.         }  
  191.     }  
  192.     
  193.   }  
  194. 3、运行程序  
  195.    右键运行程序Consumer类,控制台打印出如下信息:  
  196.      
  197.    再右键运行Producer类,控制台上打印出来的信息同上。稍等一秒,Producer类的运行控制台会打印出来如下信息:  
  198.      
  199.    有信息可知,生产者正在生成消息,切到消费者类的控制台方法如下:  
  200.      
  201.    选择Cosumer,会看到如下信息:  
  202.      
  203.    由信息可以看到,消费者收到了同等数量的信息。  
  204.    至此我们的第一个程序成功完成。下面将MQ与spring结合使用。  
  205. 四、spring与activeMQ的简单整合  
  206.    在做上面的测试例子的时候我们可以看出发送一个简单的消息,要几行代码!其实我们的目的就是发送和接受消息。幸运的是Spring为我们提供了大量的模板。spring为我们提供了JMSTemplate模板。  
  207. 1、引入spring相关文件和配置  
  208.    我使用的是spring版本是3.1.0.M2,其他版本的也可以,只是配置不同,去spring官网下载zip包,解开后将dist目录下的所有jar包(根据自己选择)拷贝到项目lib目录下并加入项目library中,具体可以参考上面步骤。  
  209. 在src目录下新建applicationContext.xml文件并输入一下内容:  
  210. <?xml version="1.0" encoding="GBK"?>  
  211. <beans xmlns="http://www.springframework.org/schema/beans"  
  212.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  213.     xmlns:aop="http://www.springframework.org/schema/aop"  
  214.     xmlns:tx="http://www.springframework.org/schema/tx"  
  215.     xmlns:context="http://www.springframework.org/schema/context"  
  216.     xsi:schemaLocation="   
  217.           http://www.springframework.org/schema/beans   
  218.           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
  219.           http://www.springframework.org/schema/tx   
  220.           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  221.           http://www.springframework.org/schema/context   
  222.           http://www.springframework.org/schema/context/spring-context-3.0.xsd   
  223.           http://www.springframework.org/schema/aop   
  224.           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"  
  225.     default-autowire="byName">  
  226. </beans>  
  227. 打开web.xml并将其内容修改为以下内容:  
  228. <?xml version="1.0" encoding="GBK"?>  
  229. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
  230.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  231.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  232.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  233.     <context-param>  
  234.         <param-name>contextConfigLocation</param-name>  
  235.         <param-value>classpath*:applicationContext*.xml</param-value>  
  236.     </context-param>  
  237.     <servlet>  
  238.         <servlet-name>spring</servlet-name>  
  239.         <servlet-class>  
  240.             org.springframework.web.servlet.DispatcherServlet  
  241.         </servlet-class>  
  242.         <load-on-startup>1</load-on-startup>  
  243.     </servlet>  
  244.     <servlet-mapping>  
  245.         <servlet-name>spring</servlet-name>  
  246.         <url-pattern>/</url-pattern>  
  247.     </servlet-mapping>  
  248.     <welcome-file-list>  
  249.         <welcome-file>index.jsp</welcome-file>  
  250.     </welcome-file-list>  
  251. </web-app>  
  252. 2、配置JMSTemplate模板  
  253.    类似于jdbcTemplate,首先要配置一个ConnectionFactory,之后要开始配置JmsTemplate模板了。最后是配置消息目标了。消息分为队列和主题两大类。在applicationContext.xml中加入如下内容:  
  254. <!-- 配置Jms模板  -->  
  255.     <bean id="jmsTemplate"  
  256.         class="org.springframework.jms.core.JmsTemplate">  
  257.         <property name="connectionFactory" ref="connectionFactory" />  
  258.         <property name="defaultDestination" ref="destination" />  
  259.         <property name="receiveTimeout" value="10000" />  
  260.     </bean>  
  261.     <!-- 配置JMS连接工厂 -->  
  262.     <bean id="connectionFactory"  
  263.         class="org.apache.activemq.ActiveMQConnectionFactory">  
  264.         <property name="brokerURL" value="tcp://localhost:61616" />  
  265.     </bean>  
  266.     <!-- 发送消息的目的地(队列) -->  
  267.     <bean id="destination"  
  268.         class="org.apache.activemq.command.ActiveMQQueue">  
  269.         <!-- 设置消息队列的名字 -->  
  270.         <constructor-arg index="0" value="myQueue" />  
  271.     </bean>  
  272. 配置完成了,那么如何使用JmsTemplate发送消息呢?  
  273.    spring的beanfactory得到一个jmsTemplate的实例和消息目标的实例,发送消息,够简单的吧。下面我们就来编写具体代码。  
  274. 3、编写代码  
  275. 新建类ProducerService.java,界面如下:  
  276.   
  277. 代码如下:  
  278. package com.mq.service;  
  279.   
  280. public interface ProducerService {  
  281.     public void send();  
  282. }  
  283. 新建一个生产者实现类ProducerServiceImpl.java,界面略,代码如下:  
  284. package com.mq.service;  
  285.   
  286. import java.util.Date;  
  287.   
  288. import javax.jms.Destination;  
  289. import javax.jms.JMSException;  
  290. import javax.jms.MapMessage;  
  291. import javax.jms.Message;  
  292. import javax.jms.Session;  
  293.   
  294. import org.springframework.jms.core.JmsTemplate;  
  295. import org.springframework.jms.core.MessageCreator;  
  296.   
  297. public class ProducerServiceImpl implements ProducerService {  
  298.     JmsTemplate jmsTemplate;  
  299.        
  300.     Destination destination;  
  301.     public void send() {  
  302.         MessageCreator messageCreator = new MessageCreator(){  
  303.   
  304.             public Message createMessage(Session session) throws JMSException {  
  305.                 MapMessage message = session.createMapMessage();  
  306.                 message.setLong("count", new Date().getTime());  
  307.                 System.out.println("--发送消息:"+new Date());  
  308.                 return message;  
  309.             }  
  310.         };  
  311.         jmsTemplate.send(this.destination,messageCreator);  
  312.     }  
  313.     public void setJmsTemplate(JmsTemplate jmsTemplate) {  
  314.         this.jmsTemplate = jmsTemplate;  
  315.     }  
  316.     public void setDestination(Destination destination) {  
  317.         this.destination = destination;  
  318.     }  
  319. }  
  320.    生产者编写完了,下面我们来编写消费者,上面说了,发送消息的时候,spring的beanfactory得到一个jmsTemplate的实例和消息目标的实例,然后发送,那么接受的时候肯定也是得到一个jmsTemplate的实例和消息目标的实例,然后接受,下面我们来看具体代码。  
  321.    新建一个消费者的借口和实现类,具体代码如下:  
  322.   ConsumerService.java  
  323. package com.mq.service;  
  324.   
  325. public interface ConsumerService {  
  326.     public void receive();  
  327. }  
  328.    ConsumerServiceImpl.java  
  329. package com.mq.service;  
  330.   
  331. import java.util.Date;  
  332.   
  333. import javax.jms.Destination;  
  334. import javax.jms.JMSException;  
  335. import javax.jms.MapMessage;  
  336.   
  337. import org.springframework.jms.core.JmsTemplate;  
  338.   
  339. public class ConsumerServiceImpl implements ConsumerService {  
  340.   
  341.     JmsTemplate jmsTemplate;  
  342.   
  343.     Destination destination;  
  344.   
  345.     public void receive() {  
  346.         MapMessage message = (MapMessage)jmsTemplate.receive();  
  347.         try {  
  348.             System.out.println("--收到消息:"+new Date(message.getLong("count")));  
  349.         } catch (JMSException e) {  
  350.             e.printStackTrace();  
  351.         }  
  352.     }  
  353.   
  354.     public void setJmsTemplate(JmsTemplate jmsTemplate) {  
  355.         this.jmsTemplate = jmsTemplate;  
  356.     }  
  357.   
  358.     public void setDestination(Destination destination) {  
  359.         this.destination = destination;  
  360.     }  
  361.   
  362. }  
  363.   
  364.    代码编写完毕,下面要进行bean的配置,在applicationContext.xml中加入如下代码:  
  365. <bean id="producerService"  
  366.         class="com.mq.service.ProducerServiceImpl">  
  367.         <property name="jmsTemplate" ref="jmsTemplate" />  
  368.         <property name="destination" ref="destination" />  
  369.     </bean>  
  370.   
  371.     <bean id="consumerService"  
  372.         class="com.mq.service.ConsumerServiceImpl">  
  373.         <property name="jmsTemplate" ref="jmsTemplate" />  
  374.         <property name="destination" ref="destination" />  
  375.     </bean>  
  376. 附上完整的applicationContext.xml的内容:  
  377. <?xml version="1.0" encoding="GBK"?>  
  378. <beans xmlns="http://www.springframework.org/schema/beans"  
  379.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  380.     xmlns:aop="http://www.springframework.org/schema/aop"  
  381.     xmlns:tx="http://www.springframework.org/schema/tx"  
  382.     xmlns:context="http://www.springframework.org/schema/context"  
  383.     xsi:schemaLocation="   
  384.           http://www.springframework.org/schema/beans   
  385.           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
  386.           http://www.springframework.org/schema/tx   
  387.           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  388.           http://www.springframework.org/schema/context   
  389.           http://www.springframework.org/schema/context/spring-context-3.0.xsd   
  390.           http://www.springframework.org/schema/aop   
  391.           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"  
  392.     default-autowire="byName">  
  393.     <bean id="producerService"  
  394.         class="com.mq.service.ProducerServiceImpl">  
  395.         <property name="jmsTemplate" ref="jmsTemplate" />  
  396.         <property name="destination" ref="destination" />  
  397.     </bean>  
  398.   
  399.     <bean id="consumerService"  
  400.         class="com.mq.service.ConsumerServiceImpl">  
  401.         <property name="jmsTemplate" ref="jmsTemplate" />  
  402.         <property name="destination" ref="destination" />  
  403.     </bean>  
  404.   
  405.     <!-- 配置Jms模板  -->  
  406.     <bean id="jmsTemplate"  
  407.         class="org.springframework.jms.core.JmsTemplate">  
  408.         <property name="connectionFactory" ref="connectionFactory" />  
  409.         <property name="defaultDestination" ref="destination" />  
  410.         <property name="receiveTimeout" value="10000" />  
  411.     </bean>  
  412.     <!-- 配置JMS连接工厂 -->  
  413.     <bean id="connectionFactory"  
  414.         class="org.apache.activemq.ActiveMQConnectionFactory">  
  415.         <property name="brokerURL" value="tcp://localhost:61616" />  
  416.     </bean>  
  417.     <!-- 发送消息的目的地(队列) -->  
  418.     <bean id="destination"  
  419.         class="org.apache.activemq.command.ActiveMQQueue">  
  420.         <!-- 设置消息队列的名字 -->  
  421.         <constructor-arg index="0" value="myQueue" />  
  422.     </bean>  
  423. </beans>  
  424. 4、编写测试程序  
  425.    需要的业务代码都已编写完毕,下面编写测试代码。新建一个生产者的测试类ProducerTest.java。具体代码如下:  
  426. package com.mq.service;  
  427.   
  428. import org.springframework.context.ApplicationContext;  
  429. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  430.   
  431. public class ProducerTest {  
  432.   
  433.     private static ApplicationContext appContext = new ClassPathXmlApplicationContext(  
  434.             "applicationContext.xml");  
  435.   
  436.     private static void send() {  
  437.         ProducerService producerService = (ProducerService) appContext  
  438.                 .getBean("producerService");  
  439.         producerService.send();  
  440.     }  
  441.   
  442.     /**  
  443.      * @param args  
  444.      */  
  445.     public static void main(String[] args) {  
  446.         send();  
  447.     }  
  448.   
  449. }  
  450.    再建一个消费者的测试类,ConsumerTest.java,具体代码如下:  
  451. package com.mq.service;  
  452.   
  453. import org.springframework.context.ApplicationContext;  
  454. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  455.   
  456. public class ConsumerTest {  
  457.   
  458.     private static ApplicationContext appContext = new ClassPathXmlApplicationContext(  
  459.             "applicationContext.xml");  
  460.   
  461.     private static void receive() {  
  462.         ConsumerService consumerService = (ConsumerService) appContext  
  463.                 .getBean("consumerService");  
  464.         consumerService.receive();  
  465.     }  
  466.   
  467.     /**  
  468.      * @param args  
  469.      */  
  470.     public static void main(String[] args) {  
  471.         receive();  
  472.     }  
  473.   
  474. }  
  475. 5、运行程序  
  476.    所有代码都编写完了,我们来看一下我们的劳动成果。运行生产者测试类。控制台打印出如下内容,红线标注的冒号后面就是我们发送的内容:  
  477.   
  478.    运行消费者测试类。控制台打印出如下内容,红线标注的冒号后面就是我们接受的内容:  
  479.   
  480. 两者是一样的。  
  481.    看来我们的劳动成果没有白费。以上是一些AciveMQ的基本应用,在接下来的时间,我会写一些高级应方面的文章,敬请关注本人百度空间和新郎微博。也欢迎各位通过一下两种途径和我进行交流,共同进步。推荐一下本人的微博,作为程序员,生活是非常枯燥的(一般都是很枯燥的,哪些以此为乐的不涉及),平时要自己丰富一下自己的业余生活,看些搞笑微博之类的。我每天都会发布一些糗事,欢迎大家关注。另外我在网上看到过有句话——程序员活该你单身身的,程序员招谁惹谁了啊,我们就应该单身。不过话又说回来了,程序员的生活确实单调,感情不丰富,不会说话,但是不能怨我们,其实我们也不想这样。推荐关注新浪微博一千零一夜话,微博地址:http://weibo.com/1968007227/,每天发布一条夜话,你懂得,希望各位程序猿每天能给自己的另一位一句温馨的话,不要成为苦逼的娃。  
  482. 五、参考内容  
  483.    1、http://yunzhongxia.iteye.com/blog/566727  
  484.    2、ActiveMQ in action  
  485.    3、apache官网  
0 0
原创粉丝点击