Java中間件JMS(三)之ActiveMQ整合spring(二)

原文鏈接:http://blog.csdn.net/dwc_fly/article/details/10834005    

對於讓spring管理監聽的實現方式有兩種方法,一種是自己寫監聽器,然後交給spring的監聽適配器管理,再由監聽容器管理監聽適配器,另一種是寫一個實現MessageListener接口的類。第一種在第一章涉及到,但是沒有交給spring託管.其實實現的方法很簡單,在j2ee mvc模式中,用到spring的aop特性.這章講第

二種方法,這樣消費者可以時時接受到生產者的消息,訂閱者可以時時接受到發佈者的消息.不用循環接受。

 

1.Queue(點對點)方式

 

消費者QueueConsumerMessageListener類,具體如下:

 

[java] view plaincopy
 
  1. package jms.mq.spring;  
  2.   
  3. import javax.jms.JMSException;  
  4. import javax.jms.Message;  
  5. import javax.jms.MessageListener;  
  6. import javax.jms.TextMessage;  
  7.   
  8. public class QueueConsumerMessageListener implements MessageListener{  
  9.     public void onMessage(Message msg) {  
  10.         if(msg instanceof TextMessage){  
  11.             TextMessage textMessage = (TextMessage) msg;  
  12.             try {  
  13.                 System.out.println("--隊列 MessageListener收到信息:"+textMessage.getText());  
  14.             } catch (JMSException e) {  
  15.                 e.printStackTrace();  
  16.             }  
  17.         }  
  18.     }  
  19. }  

 

 

2.Topic(發佈/訂閱)方式

訂閱者實現類TopicSubscriberMessageListener類,具體如下:

[java] view plaincopy
 
  1. package jms.mq.spring;  
  2.   
  3. import javax.jms.JMSException;  
  4. import javax.jms.Message;  
  5. import javax.jms.MessageListener;  
  6. import javax.jms.TextMessage;  
  7.   
  8. public class TopicSubscriberMessageListener implements MessageListener{  
  9.     public void onMessage(Message msg) {  
  10.         if(msg instanceof TextMessage){  
  11.             TextMessage textMessage = (TextMessage) msg;  
  12.             try {  
  13.                 System.out.println("--訂閱者 MessageListener收到信息:"+textMessage.getText());  
  14.             } catch (JMSException e) {  
  15.                 e.printStackTrace();  
  16.             }  
  17.         }  
  18.     }  
  19. }  



3.修改配置文件

 

[html] view plaincopy
 
  1. <!-- 實現接口的方式 -->  
  2.     <bean id="queueConsumerMessageListener" class="jms.mq.spring.QueueConsumerMessageListener">  
  3.     </bean>  
  4.     <!-- 新增一個隊列地址名字不能跟上面的重複 -->  
  5.     <bean id="queueConsumerMessageListenerDest" class="org.apache.activemq.command.ActiveMQQueue">  
  6.         <constructor-arg index="0" value="myMessageListenerQueue" />  
  7.     </bean>  
  8.     <bean id="myMsgQueuelistenerContainer"  
  9.         class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
  10.         <property name="connectionFactory" ref="connectionFactory" />  
  11.         <property name="destination" ref="queueConsumerMessageListenerDest" />  
  12.         <property name="messageListener" ref="queueConsumerMessageListener" />  
  13.         <property name="receiveTimeout" value="10000" />  
  14.     </bean>  
  15.   
  16.     <bean id="topicSubscriberMessageListener" class="jms.mq.spring.TopicSubscriberMessageListener"></bean>  
  17.     <bean id="topicSubscriberMessageListenerDest" class="org.apache.activemq.command.ActiveMQTopic">  
  18.         <constructor-arg index="0" value="myMessageListenerTopic" />  
  19.     </bean>  
  20.     <bean id="myMsgTopiclistenerContainer"  
  21.         class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
  22.         <property name="connectionFactory" ref="connectionFactory" />  
  23.         <property name="destination" ref="topicSubscriberMessageListenerDest" />  
  24.         <property name="messageListener" ref="topicSubscriberMessageListener" />  
  25.         <property name="pubSubDomain" value="true" />  
  26.         <property name="receiveTimeout" value="10000" />  
  27.     </bean>  


順便將上一章的配置也改一下

 

[html] view plaincopy
 
  1. <bean id="queueProducerService" class="jms.mq.spring.QueueProducerService">  
  2.         <property name="jmsTemplate" ref="jmsQueueTemplate" />  
  3.         <!--<property name="destination" ref="queueDest" /> -->  
  4.         <property name="destination" ref="queueConsumerMessageListenerDest" />  
  5.     </bean>  
  6.   
  7.     <bean id="queueConsumerService" class="jms.mq.spring.QueueConsumerService">  
  8.         <property name="jmsTemplate" ref="jmsQueueTemplate" />  
  9.         <property name="destination" ref="queueDest" />   
  10.     </bean>  
  11.   
  12.   
  13.     <bean id="topicPublisherService" class="jms.mq.spring.TopicPublisherService">  
  14.         <property name="jmsTemplate" ref="jmsTopicTemplate" />  
  15.         <!-- <property name="destination" ref="topicDest" /> -->  
  16.         <property name="destination" ref="topicSubscriberMessageListenerDest" />  
  17.     </bean>  
  18.   
  19.     <bean id="topicSubscriberService" class="jms.mq.spring.TopicSubscriberService">  
  20.         <property name="jmsTemplate" ref="jmsTopicTemplate" />  
  21.         <property name="destination" ref="topicDest" />  
  22.     </bean>  

 

注意是修改 bean id爲queueProducerService和的topicPublisherService的destination

 

4.運行

Queue(點對點)方式,只運行QueueProducerTest.java,結果如下

 

Topic(發佈/訂閱)方式,只運行TopicPublisherTest.java,結果如下

 

ok,如果Queue(點對點)方式和Topic(發佈/訂閱)方式運行的結果如上圖所示,說明你成功了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章