Spring与activeMQ(嵌入式启动activemq)

 一、准备工作

        一般的我们发送jms消息都需要启动activemq来当做服务器,消息发送到activemq后,在通过监听activemq的消息来接收到消息,activemq下载地址http://activemq.apache.org/download.html,然后通过activemq.bat来启动, 在这里我将通过一个例子来慢慢的讲解spring嵌入式启动ActiveMQ以及ActiveMQ监听器,发送订阅和点对点消息等,用到的是springMVC,这样我们就不需要启动activemq服务器就能够发送消息了,需要导入springmvc相关的jar包和activemqall包activemqjar包可以在下载的文件夹中找到。

二、从配置文件说起

      首先是web项目的起点说起,web.xml:

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  
  3.   <display-name>StudentManager</display-name>  
  4.   <welcome-file-list>  
  5.     <welcome-file>index.html</welcome-file>  
  6.   </welcome-file-list>  
  7.   <servlet>  
  8.         <servlet-name>websocket</servlet-name>  
  9.         <servlet-class>main.java.test.websocket.WebSocketInitServlet</servlet-class>  
  10.     </servlet>  
  11.     <servlet-mapping>  
  12.         <servlet-name>websocket</servlet-name>  
  13.         <url-pattern>/websocket.ws</url-pattern>  
  14.     </servlet-mapping>  
  15.     <!-- <context-param>  
  16.         <param-name>contextConfigLocation</param-name>  
  17.         <param-value>classpath:main/resource/ActiveMQ.xml</param-value>  
  18.     </context-param> -->  
  19.     <servlet>    
  20.      <servlet-name>spring</servlet-name>    
  21.       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  22.        <init-param>    
  23.             <param-name>contextConfigLocation</param-name>    
  24.             <param-value>classpath:main/resource/spring-servlet.xml</param-value>    
  25.         </init-param>    
  26.       <load-on-startup>1</load-on-startup>    
  27.     </servlet>  
  28.      <servlet-mapping>    
  29.       <servlet-name>spring</servlet-name>    
  30.       <url-pattern>/*</url-pattern>    
  31.     </servlet-mapping>    
  32.     <context-param>    
  33.       <param-name>contextConfigLocation</param-name>    
  34.       <param-value>classpath:main/resource/applicationContext.xml</param-value>    
  35.   </context-param>   
  36.     
  37. </web-app>  

 这里面大家应该都能看懂,配置文件定义了两个servlet一个websocket一个spring,第一个大家可以不用关心,springservlet是springMVC的核心,这里关注的是spring的配置文件,applicationContext.xml这里先贴出配置文件,

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:context="http://www.springframework.org/schema/context"  
  5.           xmlns:jms="http://www.springframework.org/schema/jms"  
  6.           xmlns:amq="http://activemq.apache.org/schema/core"  
  7.         xsi:schemaLocation="    
  8.               http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd  
  9.               http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd    
  10.               http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd  
  11.               http://www.springframework.org/schema/context  
  12.         http://www.springframework.org/schema/context/spring-context-3.0.xsd">    
  13.     <import resource="myActiveMQDemo.xml"/>  
  14.   </beans>  

 这里就是引入了一个activemq相关的配置文件,myActiveMQDemo.xml就是配置spring中的ActiveMQ如下:

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amq="http://activemq.apache.org/schema/core"  
  5.     xmlns:jms="http://www.springframework.org/schema/jms"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans     
  7.         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd     
  8.         http://www.springframework.org/schema/context     
  9.         http://www.springframework.org/schema/context/spring-context-4.0.xsd  
  10.         http://www.springframework.org/schema/jms  
  11.         http://www.springframework.org/schema/jms/spring-jms-4.0.xsd  
  12.         http://activemq.apache.org/schema/core  
  13.         http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd">  
  14.           
  15.      <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">   
  16.      <property name="config" value="classpath:main/resource/ActiveMQConfig.xml" />   
  17.      <property name="start"  value="true" />   
  18.     </bean>    
  19.      <bean id="myamqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">    
  20.          <property name="brokerURL" value="tcp://localhost:61616"/>    
  21.          <property name="trustedPackages">  
  22.         <list>  
  23.             <value>main.java</value>  
  24.         </list>  
  25.     </property>   
  26.     </bean>  
  27.      <bean id="myconnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">  
  28.         <property name="targetConnectionFactory" ref="myamqConnectionFactory"></property>  
  29.         <property name="sessionCacheSize" value="100" />  
  30.     </bean>  
  31.       
  32.   
  33.     <bean id="myjmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">  
  34.         <constructor-arg ref="myconnectionFactory" />  
  35.         <property name="pubSubDomain" value="false" />  
  36.     </bean>  
  37.   
  38.     <bean id="myjmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">  
  39.         <constructor-arg ref="myconnectionFactory" />  
  40.         <property name="pubSubDomain" value="true" />  
  41.     </bean>  
  42.     <bean id="mymsgQueueSender" class="main.java.test.jms.mydemo.Service.MsgQueueSenderImp">  
  43.         <property name="jmsTemplate" ref="myjmsQueueTemplate"/>  
  44.     </bean>  
  45.      <bean id="mymsgTopicSender" class="main.java.test.jms.mydemo.Service.MsgTopicSenderImp">  
  46.         <property name="jmsTemplate" ref="myjmsTopicTemplate"/>  
  47.     </bean>  
  48.     <bean id="myqueueDestination" class="org.apache.activemq.command.ActiveMQQueue">    
  49.           <constructor-arg>    
  50.                <value>msg_topic_two</value>    
  51.           </constructor-arg>    
  52.     </bean>    
  53.     <!--这个是主题目的地,一对多的-->    
  54.     <bean id="mytopicDestination" class="org.apache.activemq.command.ActiveMQTopic">    
  55.            <constructor-arg value="msg_topic_one"/>    
  56.     </bean>  
  57.     <bean id="mytopicDestination2" class="org.apache.activemq.command.ActiveMQTopic">    
  58.            <constructor-arg value="msg_topic_two"/>    
  59.     </bean>  
  60.       
  61.     <!-- 消息监听器 -->    
  62.     <bean id="mytopicConsumer" class="main.java.test.jms.mydemo.consumer.TopicConsumer">  
  63.         <property name="destination" ref="mytopicDestination"/>  
  64.     </bean>  
  65.     <bean id="mytopicConsumer2" class="main.java.test.jms.mydemo.consumer.TopicConsumer2">  
  66.         <property name="destination" ref="mytopicDestination"/>  
  67.     </bean>         
  68.       
  69.     <bean id="myqueueDestinationMessageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">    
  70.      <property name="delegate">    
  71.         <bean class="main.java.test.jms.mydemo.consumer.TopicConsumer"/>   
  72.     </property>  
  73.      <property name="defaultListenerMethod" value="onMessage"/>   
  74.     </bean>    
  75.     <bean id="myjMSReceiverQueueListenerAdapter" class=" org.springframework.jms.listener.DefaultMessageListenerContainer">      
  76.           <property name="connectionFactory" ref="myconnectionFactory" />      
  77.         <property name="destination" ref="mytopicDestination" />      
  78.         <property name="messageListener" ref="myqueueDestinationMessageListenerAdapter" />   
  79.     </bean>   
  80.       
  81.      <bean id="myqueueDestinationMessageListenerAdapter2" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">    
  82.      <property name="delegate">    
  83.         <bean class="main.java.test.jms.mydemo.consumer.TopicConsumer2"/>   
  84.     </property>  
  85.      <property name="defaultListenerMethod" value="onMessage"/>   
  86.     </bean>    
  87.     <bean id="myjMSReceiverQueueListenerAdapter2" class=" org.springframework.jms.listener.DefaultMessageListenerContainer">      
  88.           <property name="connectionFactory" ref="myconnectionFactory" />      
  89.         <property name="destination" ref="mytopicDestination" />      
  90.         <property name="messageListener" ref="myqueueDestinationMessageListenerAdapter2" />   
  91.     </bean>  
  92.       
  93.      <bean id="myqueueDestinationMessageListenerAdapter3" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">    
  94.      <property name="delegate">    
  95.         <bean class="main.java.test.jms.mydemo.consumer.QueueConsumer"/>   
  96.     </property>  
  97.      <property name="defaultListenerMethod" value="onMessage"/>   
  98.     </bean>    
  99.     <bean id="myjMSReceiverQueueListenerAdapter3" class=" org.springframework.jms.listener.DefaultMessageListenerContainer">      
  100.           <property name="connectionFactory" ref="myconnectionFactory" />      
  101.         <property name="destination" ref="myqueueDestination" />      
  102.         <property name="messageListener" ref="myqueueDestinationMessageListenerAdapter3" />   
  103.     </bean>  
  104.     <!-- 方式二  end-->  
  105. </beans>    

 这个配置文件首先配置了一个broker,这是ActiveMQ服务的关键bean,有了他我们就可以不用启动ActiveMQ服务了,而ActiveMQConfig配置文件的内容如下:

 

 

Xml代码   收藏代码
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  4.   http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">  
  5.     <bean  
  6.         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" />  
  7.     <broker useJmx="false" persistent="false"  
  8.         xmlns="http://activemq.apache.org/schema/core">  
  9.         <transportConnectors>  
  10.             <transportConnector uri="tcp://localhost:61616"/>  
  11.         </transportConnectors>  
  12.     </broker>  
  13. </beans>  

 到这里,配置文件就结束了,看到这里的同学可能觉得有点绕,这里我解释一下,首先进入spring的配置文件,applicationContext.xml这个配置文件配置了spring中配置ActiveMQ的全部配置信息的文件myActiveMQDemo.xml,myActiveMQDemo.xml这个配置文件就是配置所有的ActiveMQ的信息,首先,我们嵌入式启动ActiveMQ就需要定义出他的关键服务:broker,broker是服务我们jms消息的关键服务,classpath:main/resource/ActiveMQConfig.xml这个则是配置了broker服务的关键信息,其实就是配置了一个连接地址,接下来回到myActiveMQDemo.xml这个配置文件,往下走...

 

 

Xml代码   收藏代码
  1. <bean id="myamqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">    
  2.          <property name="brokerURL" value="tcp://localhost:61616"/>    
  3.          <property name="trustedPackages">  
  4.         <list>  
  5.             <value>main.java</value>  
  6.         </list>  
  7.     </property>   
  8.     </bean>  
  9.      <bean id="myconnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">  
  10.         <property name="targetConnectionFactory" ref="myamqConnectionFactory"></property>  
  11.         <property name="sessionCacheSize" value="100" />  
  12.     </bean>  

 这两个bean是配置ActiveMQ的连接信息,第一个是配置连接工厂,真正连接的是myconnectionFactory这个bean,我们使用的是CachingConnectionFactory,接下来就是配置发送消息的spring模板bean,因为虽然我们配置了连接工厂,就如同spring的数据库连接模板一样,他为你写好了很多的样板代码,我们只需要调用模板中的发送方法就可以发送消息了,模板配置:

Xml代码   收藏代码
  1. <bean id="myjmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">  
  2.         <constructor-arg ref="myconnectionFactory" />  
  3.         <property name="pubSubDomain" value="true" />  
  4.     </bean>  
  5.     <bean id="mymsgQueueSender" class="main.java.test.jms.mydemo.Service.MsgQueueSenderImp">  
  6.         <property name="jmsTemplate" ref="myjmsQueueTemplate"/>  
  7.     </bean>  

 这两个template可以说是一样的,pubSubDomain属性时配置发送订阅消息还是发送点对点消息,第一个bean就表示这是一个可以发送订阅消息的bean,只要把它注入到服务类中,调用他的方法就可以发送订阅消息,第二个bean是配置点对点的template。

 

 

 

Xml代码   收藏代码
  1. <bean id="mymsgQueueSender" class="main.java.test.jms.mydemo.Service.MsgQueueSenderImp">  
  2.         <property name="jmsTemplate" ref="myjmsQueueTemplate"/>  
  3.     </bean>  
  4.      <bean id="mymsgTopicSender" class="main.java.test.jms.mydemo.Service.MsgTopicSenderImp">  
  5.         <property name="jmsTemplate" ref="myjmsTopicTemplate"/>  
  6.     </bean>  

 这里就是将template注入到服务类中,后面会贴出服务类的java代码,接下来就是配置目的地:

Xml代码   收藏代码
  1. <bean id="myqueueDestination" class="org.apache.activemq.command.ActiveMQQueue">    
  2.           <constructor-arg>    
  3.                <value>msg_topic_two</value>    
  4.           </constructor-arg>    
  5.     </bean>    
  6.     <!--这个是主题目的地,一对多的-->    
  7.     <bean id="mytopicDestination" class="org.apache.activemq.command.ActiveMQTopic">    
  8.            <constructor-arg value="msg_topic_one"/>    
  9.     </bean>  
  10.     <bean id="mytopicDestination2" class="org.apache.activemq.command.ActiveMQTopic">    
  11.            <constructor-arg value="msg_topic_two"/>    
  12.     </bean>  

 配置了三个目的地,分别是点对点消息目的地,msg_topic_two , 订阅消息目的地:msg_topic_one和msg_topic_two接下来就是配置消息监听器,消息监听器有三种,可以参考;

 

http://dwj147258.iteye.com/blog/2330295,这里我们是用的第三种

 

先贴出xml代码:

Xml代码   收藏代码
  1. <bean id="myqueueDestinationMessageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">    
  2.      <property name="delegate">    
  3.         <bean class="main.java.test.jms.mydemo.consumer.TopicConsumer"/>   
  4.     </property>  
  5.      <property name="defaultListenerMethod" value="onMessage"/>   
  6. <span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;"> </span><span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;"><</span><span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;">property</span><span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;"> </span><span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;">name</span><span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;">=</span><span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;">"defaultResponseDestination"</span><span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;"> </span><span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;">ref</span><span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;">=</span><span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;">"defaultResponseQueue"</span><span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;">/></span><span style="color: blue; font-family: Arial; font-size: 13.63636302948px; line-height: 26px;"> </span>  
  7.     </bean>    
  8.     <bean id="myjMSReceiverQueueListenerAdapter" class=" org.springframework.jms.listener.DefaultMessageListenerContainer">      
  9.           <property name="connectionFactory" ref="myconnectionFactory" />      
  10.         <property name="destination" ref="mytopicDestination" />      
  11.         <property name="messageListener" ref="myqueueDestinationMessageListenerAdapter" />   
  12.     </bean>   
  13.       
  14.      <bean id="myqueueDestinationMessageListenerAdapter2" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">    
  15.      <property name="delegate">    
  16.         <bean class="main.java.test.jms.mydemo.consumer.TopicConsumer2"/>   
  17.     </property>  
  18.      <property name="defaultListenerMethod" value="onMessage"/>   
  19.     </bean>    
  20.     <bean id="myjMSReceiverQueueListenerAdapter2" class=" org.springframework.jms.listener.DefaultMessageListenerContainer">      
  21.           <property name="connectionFactory" ref="myconnectionFactory" />      
  22.         <property name="destination" ref="mytopicDestination" />      
  23.         <property name="messageListener" ref="myqueueDestinationMessageListenerAdapter2" />   
  24.     </bean>  
  25.       
  26.      <bean id="myqueueDestinationMessageListenerAdapter3" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">    
  27.      <property name="delegate">    
  28.         <bean class="main.java.test.jms.mydemo.consumer.QueueConsumer"/>   
  29.     </property>  
  30.      <property name="defaultListenerMethod" value="onMessage"/>   
  31.     </bean>    
  32.     <bean id="myjMSReceiverQueueListenerAdapter3" class=" org.springframework.jms.listener.DefaultMessageListenerContainer">      
  33.           <property name="connectionFactory" ref="myconnectionFactory" />      
  34.         <property name="destination" ref="myqueueDestination" />      
  35.         <property name="messageListener" ref="myqueueDestinationMessageListenerAdapter3" />   
  36.     </bean>  

这是定义了三个消息监听器,拿一个出来解释就可以了,myqueueDestinationMessageListenerAdapter是定义了一个消息监听器,里面的属性delegate时指出消息监听类,defaultListenerMethod是指定接收消息的方法,defaultResponseDestination是指定回复消息的目的地,接下来就是配置消息监听器容器,里面的属性分别是配置连接工厂,目的地,以及消息监听器。到这里,配置问价那就已经全部结束。

 

三、前端和后台

 在前端主要就是一个jsp页面:

 

Html代码   收藏代码
  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <%  
  4.     String path = request.getContextPath();  
  5.     System.out.println(path);  
  6.     String basePath = request.getScheme() + "://"  
  7.             + request.getServerName() + ":" + request.getServerPort()  
  8.             + path + "/";  
  9.     System.out.println(basePath);  
  10. %>  
  11.   
  12. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  13. <html>  
  14. <head>  
  15. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  16. <base href="<%=basePath%>">  
  17.   
  18. <title>ActiveMQ Demo程序</title>  
  19.   
  20. <meta http-equiv="pragma" content="no-cache">  
  21. <meta http-equiv="cache-control" content="no-cache">  
  22. <meta http-equiv="expires" content="0">  
  23. <script type="text/javascript" src="js/jquery.js"></script>  
  24. <style type="text/css">  
  25. .h1 {  
  26.     margin: 0 auto;  
  27. }  
  28.   
  29. #producer{  
  30.     width: 48%;  
  31.     border: 1px solid blue;   
  32.     height: 80%;  
  33.     align:center;  
  34.     margin:0 auto;  
  35. }  
  36.   
  37. body{  
  38.     text-align :center;  
  39. }   
  40. div {  
  41.     text-align :center;  
  42. }  
  43. textarea{  
  44.     width:80%;  
  45.     height:100px;  
  46.     border:1px solid gray;  
  47. }  
  48. button{  
  49.     background-color: rgb(62, 156, 66);  
  50.     border: none;  
  51.     font-weight: bold;  
  52.     color: white;  
  53.     height:30px;  
  54. }  
  55. </style>  
  56. <script type="text/javascript">  
  57.       
  58.     function send(controller){  
  59.         if($("#message").val()==""){  
  60.             $("#message").css("border","1px solid red");  
  61.             return;  
  62.         }else{  
  63.             $("#message").css("border","1px solid gray");  
  64.         }  
  65.         debugger  
  66.         $.ajax({  
  67.             type : "POST",  
  68.             url:"activemq/"+controller,  
  69.             dataType:'text',   
  70.             data:{"message":$("#message").val()},  
  71.             success:function(data){  
  72.                 if(data=="suc"){  
  73.                     $("#status").html("<font color=green>发送成功</font>");  
  74.                     setTimeout(clear,1000);  
  75.                 }else{  
  76.                     $("#status").html("<font color=red>"+data+"</font>");  
  77.                     setTimeout(clear,5000);  
  78.                 }  
  79.             },  
  80.             error:function(data){  
  81.                 $("#status").html("<font color=red>ERROR:"+data["status"]+","+data["statusText"]+"</font>");  
  82.                 setTimeout(clear,5000);  
  83.             }  
  84.               
  85.         });  
  86.     }  
  87.       
  88.     function clear(){  
  89.         $("#status").html("");  
  90.     }  
  91.   
  92. </script>  
  93. </head>  
  94.   
  95. <body>  
  96.     <h1>Hello ActiveMQ</h1>  
  97.     <div id="producer">  
  98.         <h2>Producer</h2>  
  99.         <textarea id="message"></textarea>  
  100.         <br>  
  101.         <button onclick="send('queueSender')">发送Queue消息</button>  
  102.         <button onclick="send('topicSender')">发送Topic消息</button>  
  103.         <br>  
  104.         <span id="status"></span>  
  105.     </div>  
  106. </body>  
  107. </html>  

你需要引入你的jquery库,接着是控制器代码:

 

 

Java代码   收藏代码
  1. package main.java.test.jms.SpringActivemq.controller;  
  2.   
  3.   
  4.   
  5. import javax.jms.Destination;  
  6.   
  7. import main.java.bean.LoginUserInfo;  
  8. import main.java.test.jms.SpringAcrivemq2.ProducerServiceImpl;  
  9. import main.java.test.jms.SpringActivemq.mq.producer.queue.QueueSender;  
  10. import main.java.test.jms.SpringActivemq.mq.producer.topic.TopicSender;  
  11. import main.java.test.jms.mydemo.Service.MsgQueueSenderImp;  
  12. import main.java.test.jms.mydemo.Service.MsgTopicSenderImp;  
  13. import main.java.test.jms.mydemo.consumer.ConstUtil;  
  14. import main.java.util.BeanUtil;  
  15.   
  16. import org.springframework.stereotype.Controller;  
  17. import org.springframework.web.bind.annotation.RequestMapping;  
  18. import org.springframework.web.bind.annotation.RequestParam;  
  19. import org.springframework.web.bind.annotation.ResponseBody;  
  20.   
  21.   
  22. /** 
  23.  *  
  24.  * @author liang 
  25.  * @description controller娴嬭瘯 
  26.  */  
  27. @Controller  
  28. @RequestMapping("/activemq")  
  29. public class ActivemqController {  
  30.       
  31.       
  32.     /** 
  33.      * 鍙戦�娑堟伅鍒伴槦鍒� 
  34.      * Queue闃熷垪锛氫粎鏈変竴涓闃呰�浼氭敹鍒版秷鎭紝娑堟伅涓�棪琚鐞嗗氨涓嶄細瀛樺湪闃熷垪涓� 
  35.      * @param message 
  36.      * @return String 
  37.      */  
  38.     @ResponseBody  
  39.     @RequestMapping("/queueSender")  
  40.     public String queueSender(@RequestParam("message")String message){  
  41.         String opt="";  
  42.         try {  
  43. //          queueSender.send("test.queue", message);  
  44.             MsgQueueSenderImp sender = (MsgQueueSenderImp)BeanUtil.getBeanByName("mymsgQueueSender");  
  45.              LoginUserInfo user = new LoginUserInfo();  
  46.                 user.setId(2);  
  47.                 user.setPassWord("123");  
  48.                 user.setUserName("dengwei") ;  
  49.             sender.send(ConstUtil.MSG_TOPIC_TWO, user) ;  
  50.             opt = "suc";  
  51.         } catch (Exception e) {  
  52.             opt = e.getCause().toString();  
  53.         }  
  54.         return opt;  
  55.     }  
  56.       
  57.     /** 
  58.      * 鍙戦�娑堟伅鍒颁富棰� 
  59.      * Topic涓婚 锛氭斁鍏ヤ竴涓秷鎭紝鎵�湁璁㈤槄鑰呴兘浼氭敹鍒� 
  60.      * 杩欎釜鏄富棰樼洰鐨勫湴鏄竴瀵瑰鐨� 
  61.      * @param message 
  62.      * @return String 
  63.      */  
  64.     @ResponseBody  
  65.     @RequestMapping("/topicSender")  
  66.     public String topicSender(@RequestParam("message")String message){  
  67.         String opt = "";  
  68.         try {  
  69.             System.out.println("fasong");  
  70. //          topicS.send("topic", message);  
  71.             MsgTopicSenderImp sender = (MsgTopicSenderImp)BeanUtil.getBeanByName("mymsgTopicSender");  
  72.              LoginUserInfo user = new LoginUserInfo();  
  73.                 user.setId(2);  
  74.                 user.setPassWord("123");  
  75.                 user.setUserName("dengwei") ;  
  76.             sender.send(ConstUtil.MSG_TOPIC_ONE, user) ;  
  77.             opt = "suc";  
  78.         } catch (Exception e) {  
  79.             opt = e.getCause().toString();  
  80.         }  
  81.         return opt;  
  82.     }  
  83.       
  84. }  

 实例类代码:

Java代码   收藏代码
  1. package main.java.bean;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class LoginUserInfo implements Serializable{  
  6.   
  7.     private static final long serialVersionUID = -5668675616184265758L;  
  8.   
  9.     private String userName ;   
  10.       
  11.     private String passWord ;   
  12.       
  13.     private String role ;   
  14.       
  15.     private int id  ;  
  16.   
  17.     public String getUserName() {  
  18.         return userName;  
  19.     }  
  20.   
  21.     public void setUserName(String userName) {  
  22.         this.userName = userName;  
  23.     }  
  24.   
  25.     public String getPassWord() {  
  26.         return passWord;  
  27.     }  
  28.   
  29.     public void setPassWord(String passWord) {  
  30.         this.passWord = passWord;  
  31.     }  
  32.   
  33.     public String getRole() {  
  34.         return role;  
  35.     }  
  36.   
  37.     public void setRole(String role) {  
  38.         this.role = role;  
  39.     }  
  40.   
  41.     public int getId() {  
  42.         return id;  
  43.     }  
  44.   
  45.     public void setId(int id) {  
  46.         this.id = id;  
  47.     }  
  48.   
  49.     @Override  
  50.     public String toString() {  
  51.         return "LoginUserInfo [userName=" + userName + ", passWord=" + passWord  
  52.                 + ", role=" + role + ", id=" + id + "]";  
  53.     }  
  54.       
  55.       
  56.       
  57. }  

 发送订阅消息接口:

Java代码   收藏代码
  1. package main.java.test.jms.mydemo.interfa;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public interface MsgTopicSender {  
  6.       
  7.     public void send(String topic , Serializable msg);  
  8.       
  9. }  

 发送点对点消息接口:

Java代码   收藏代码
  1. package main.java.test.jms.mydemo.interfa;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public interface MsgQueueSender {  
  6.       
  7.     public void send(String queue , Serializable msg);  
  8.       
  9. }  

 消费者接口:

 

Java代码   收藏代码
  1. package main.java.test.jms.mydemo.interfa;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public interface Consumer {  
  6.     public void onMessage(Serializable msg);  
  7.       
  8.     public String getDest() ;  
  9. }  

 目的地:

Java代码   收藏代码
  1. package main.java.test.jms.mydemo.consumer;  
  2.   
  3. public class ConstUtil {  
  4.     public static String MSG_TOPIC_ONE = "msg_topic_one" ;  
  5.       
  6.     public static String MSG_TOPIC_TWO ="msg_topic_two" ;  
  7. }  

 订阅消息发送类:

 

Java代码   收藏代码
  1. package main.java.test.jms.mydemo.Service;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.jms.JMSException;  
  6. import javax.jms.Message;  
  7. import javax.jms.ObjectMessage;  
  8. import javax.jms.Session;  
  9.   
  10. import org.springframework.jms.core.JmsTemplate;  
  11. import org.springframework.jms.core.MessageCreator;  
  12.   
  13. import main.java.test.jms.mydemo.interfa.MsgTopicSender;  
  14.   
  15. public class MsgTopicSenderImp implements MsgTopicSender{  
  16.       
  17.     private JmsTemplate jmsTemplate ;  
  18.       
  19.     @Override  
  20.     public void send(String topic,final Serializable msg) {  
  21.         jmsTemplate.send(topic, new MessageCreator() {    
  22.             public Message createMessage(Session session) throws JMSException {    
  23.                 ObjectMessage message = session.createObjectMessage();  
  24.                 message.setObject(msg);  
  25.                 return message;    
  26.             }    
  27.         });  
  28.     }  
  29.   
  30.     public JmsTemplate getJmsTemplate() {  
  31.         return jmsTemplate;  
  32.     }  
  33.   
  34.     public void setJmsTemplate(JmsTemplate jmsTemplate) {  
  35.         this.jmsTemplate = jmsTemplate;  
  36.     }  
  37.   
  38.       
  39. }  

 

 

 

点对点消息发送类:

 

Java代码   收藏代码
  1. package main.java.test.jms.mydemo.Service;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.jms.JMSException;  
  6. import javax.jms.Message;  
  7. import javax.jms.ObjectMessage;  
  8. import javax.jms.Session;  
  9.   
  10. import main.java.test.jms.mydemo.interfa.MsgQueueSender;  
  11.   
  12. import org.springframework.jms.core.JmsTemplate;  
  13. import org.springframework.jms.core.MessageCreator;  
  14.   
  15. public class MsgQueueSenderImp implements MsgQueueSender{  
  16.       
  17.     private JmsTemplate jmsTemplate ;  
  18.     @Override  
  19.     public void send(String queue, final Serializable msg) {  
  20.   
  21.         jmsTemplate.send(queue, new MessageCreator() {    
  22.             public Message createMessage(Session session) throws JMSException {    
  23.                 ObjectMessage message = session.createObjectMessage();  
  24.                 message.setObject(msg);  
  25.                 return message;    
  26.             }    
  27.         });  
  28.           
  29.     }  
  30.     public JmsTemplate getJmsTemplate() {  
  31.         return jmsTemplate;  
  32.     }  
  33.     public void setJmsTemplate(JmsTemplate jmsTemplate) {  
  34.         this.jmsTemplate = jmsTemplate;  
  35.     }  
  36.       
  37. }  

 订阅消息消费者1:

Java代码   收藏代码
  1. package main.java.test.jms.mydemo.consumer;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.jms.Destination;  
  6.   
  7. import main.java.bean.LoginUserInfo;  
  8. import main.java.test.jms.mydemo.interfa.Consumer;  
  9.   
  10. public class TopicConsumer implements Consumer{  
  11.     private Destination destination ;  
  12.       
  13.     @Override  
  14.     public void onMessage(Serializable msg) {  
  15.         System.out.println("Topicconsumer receive");  
  16.         if(msg instanceof LoginUserInfo){  
  17.             LoginUserInfo user = (LoginUserInfo)msg ;  
  18.             System.out.println(user);  
  19.         }  
  20.     }  
  21.     public void handleMessage(Serializable msg){  
  22.         System.out.println("handmessage");  
  23.     }  
  24.     @Override  
  25.     public String getDest() {  
  26.         return ConstUtil.MSG_TOPIC_ONE ;  
  27.     }  
  28.   
  29.     public Destination getDestination() {  
  30.         return destination;  
  31.     }  
  32.   
  33.     public void setDestination(Destination destination) {  
  34.         this.destination = destination;  
  35.     }  
  36.   
  37. }  

 订阅消息消费者2:

Java代码   收藏代码
  1. package main.java.test.jms.mydemo.consumer;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.jms.Destination;  
  6.   
  7. import main.java.bean.LoginUserInfo;  
  8. import main.java.test.jms.mydemo.interfa.Consumer;  
  9.   
  10. public class TopicConsumer2 implements Consumer{  
  11.     private Destination destination ;  
  12.     @Override  
  13.     public void onMessage(Serializable msg) {  
  14.         System.out.println("Topicconsumer2 receive");  
  15.         if(msg instanceof LoginUserInfo){  
  16.             LoginUserInfo user = (LoginUserInfo)msg ;  
  17.             System.out.println(user);  
  18.         }  
  19.     }  
  20.       
  21.     @Override  
  22.     public String getDest() {  
  23.         return ConstUtil.MSG_TOPIC_ONE ;  
  24.     }  
  25.   
  26.     public Destination getDestination() {  
  27.         return destination;  
  28.     }  
  29.   
  30.     public void setDestination(Destination destination) {  
  31.         this.destination = destination;  
  32.     }  
  33.   
  34. }  

 点对点消息消费者:

Java代码   收藏代码
  1. package main.java.test.jms.mydemo.consumer;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import main.java.bean.LoginUserInfo;  
  6. import main.java.test.jms.mydemo.interfa.Consumer;  
  7.   
  8. public class QueueConsumer implements Consumer{  
  9.   
  10.     @Override  
  11.     public void onMessage(Serializable msg) {  
  12.         System.out.println("QueueConsumer receive");  
  13.         if(msg instanceof LoginUserInfo){  
  14.             LoginUserInfo user = (LoginUserInfo)msg ;  
  15.             System.out.println(user);  
  16.         }  
  17.     }  
  18.   
  19.     @Override  
  20.     public String getDest() {  
  21.         // TODO Auto-generated method stub  
  22.         return null;  
  23.     }  
  24.   
  25. }  

 附上获取spring管理的bean的工具类:

Java代码   收藏代码
  1. package main.java.util;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.FileSystemXmlApplicationContext;  
  5. import org.springframework.web.context.support.WebApplicationObjectSupport;  
  6.   
  7. public class BeanUtil extends WebApplicationObjectSupport{  
  8.     private static ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:main/resource/applicationContext.xml");  
  9.     public static Object getBeanByName(String name ){  
  10.         return ac.getBean(name);  
  11.     }  
  12.       
  13. }  

四、一些问题

    过程中遇到一些问题,

①发送一次订阅消息,接收到多次一样的,这是因为获取bean的工具类没有吧applicationContext静态,每调用一次就会加载一次导致创建了多个消息监听bean

②发送消息传输对象的时候总是报序列化异常,这是因为没有吧传输对象的包设置为白名单,具体配置是在配置连接工厂的时候,在brokerURL后跟一个属性,trustedPackages,然后列出白名单包列表。如下:

Xml代码   收藏代码
  1. <bean id="myamqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">    
  2.          <property name="brokerURL" value="tcp://localhost:61616"/>    
  3.          <property name="trustedPackages">  
  4.        <list>  
  5.            <value>main.java</value>  
  6.        </list>  
  7.    </property>   

 

这里附上嵌入启动ActiveMQ的另一边值得推荐的博文http://www.cnblogs.com/dead-trap-ramble/archive/2013/11/23/3439060.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值