使用ActiveMQ和Spring配置訂閱發佈模式

 使用Spring來配置ActiveMQ的消息訂閱發佈,消息持久化

發送者的配置:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2.  
  3. <beans xmlns="http://www.springframework.org/schema/beans" 
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  6.          http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  7.          http://www.springframework.org/schema/context   
  8.          http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 
  9.  
  10.     <!-- 配置JMS連接工廠 --> 
  11.     <bean id="myConnectionFactory" 
  12.         class="org.springframework.jms.connection.CachingConnectionFactory"> 
  13.         <!-- Session緩存數量 --> 
  14.         <property name="sessionCacheSize" value="10" /> 
  15.         <property name="targetConnectionFactory"> 
  16.             <bean class="org.apache.activemq.ActiveMQConnectionFactory"> 
  17.                 <!-- MQ地址 --> 
  18.                 <property name="brokerURL" 
  19.                     value="failover:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61617)?randomize=false" /> 
  20.                 <!-- 是否異步發送 --> 
  21.                 <property name="useAsyncSend" value="false" /> 
  22.             </bean> 
  23.         </property> 
  24.     </bean> 
  25.  
  26.     <!-- 發送消息的目的地(一個主題) --> 
  27.     <bean id="myDestination" class="org.apache.activemq.command.ActiveMQTopic"> 
  28.         <!-- 設置消息主題的名字 --> 
  29.         <constructor-arg index="0" value="Online.Notice.Topic" /> 
  30.     </bean> 
  31.  
  32.     <!-- 配置JMS模版 --> 
  33.     <bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
  34.         <property name="connectionFactory" ref="myConnectionFactory" /> 
  35.         <property name="defaultDestination" ref="myDestination" /> 
  36.         <!-- 訂閱發佈模式 --> 
  37.         <property name="pubSubDomain" value="true" /> 
  38.         <property name="receiveTimeout" value="10000" /> 
  39.         <property name="explicitQosEnabled" value="true" /> 
  40.     </bean> 
  41. </beans> 

 

接收者的配置:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2.  
  3. <beans xmlns="http://www.springframework.org/schema/beans" 
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  6.          http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  7.          http://www.springframework.org/schema/context   
  8.          http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 
  9.  
  10.     <!-- 配置JMS連接工廠 --> 
  11.     <bean id="myConnectionFactory" 
  12.         class="org.springframework.jms.connection.CachingConnectionFactory"> 
  13.         <!-- Session緩存數量 --> 
  14.         <property name="sessionCacheSize" value="10" /> 
  15.         <!-- 接收者ID --> 
  16.         <property name="clientId" value="client_118" /> 
  17.         <property name="targetConnectionFactory"> 
  18.             <bean class="org.apache.activemq.ActiveMQConnectionFactory"> 
  19.                 <!-- MQ地址 --> 
  20.                 <property name="brokerURL" 
  21.                     value="failover:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61617)?randomize=false" /> 
  22.             </bean> 
  23.         </property> 
  24.     </bean> 
  25.  
  26.     <!-- 發送消息的目的地(一個主題) --> 
  27.     <bean id="myDestination" class="org.apache.activemq.command.ActiveMQTopic"> 
  28.         <!-- 設置消息主題的名字 --> 
  29.         <constructor-arg index="0" value="Online.Notice.Topic" /> 
  30.     </bean> 
  31.  
  32.     <!-- 生產消息配置 (自己定義) --> 
  33.     <bean id="myTopicConsumer" class="com.xikang.jms.SimpleJMSReceiver" /> 
  34.  
  35.     <!-- 消息監聽器 --> 
  36.     <bean id="myTopicListener" 
  37.         class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> 
  38.         <constructor-arg ref="myTopicConsumer" /> 
  39.         <!-- 接收消息的方法名稱 --> 
  40.         <property name="defaultListenerMethod" value="receive" /> 
  41.         <!-- 不進行消息轉換 --> 
  42.         <property name="messageConverter"> 
  43.             <null /> 
  44.         </property> 
  45.     </bean> 
  46.  
  47.     <!-- 消息監聽容器 --> 
  48.     <bean id="myListenerContainer" 
  49.         class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
  50.         <property name="connectionFactory" ref="myConnectionFactory" /> 
  51.         <!-- 發佈訂閱模式 --> 
  52.         <property name="pubSubDomain" value="true" /> 
  53.         <!-- 消息持久化 --> 
  54.         <property name="subscriptionDurable" value="true" /> 
  55.         <property name="receiveTimeout" value="10000" /> 
  56.         <!-- 接收者ID --> 
  57.         <property name="clientId" value="client_118" /> 
  58.         <property name="durableSubscriptionName" value="client_118" /> 
  59.         <property name="destination" ref="myDestination" /> 
  60.         <property name="messageListener" ref="myTopicListener" /> 
  61.     </bean> 
  62.  
  63. </beans> 

當有多個接收者時,修改clientId的值。

ActiveMQ好像不支持接收者的集羣。

發送者代碼:

  1. package com.xikang.jms; 
  2.  
  3. import org.apache.commons.logging.Log; 
  4. import org.apache.commons.logging.LogFactory; 
  5.  
  6. import javax.jms.JMSException; 
  7. import javax.jms.Message; 
  8. import javax.jms.Session; 
  9. import javax.jms.TextMessage; 
  10.  
  11. import org.springframework.context.ApplicationContext; 
  12. import org.springframework.context.support.ClassPathXmlApplicationContext; 
  13. import org.springframework.jms.JmsException; 
  14. import org.springframework.jms.core.JmsTemplate; 
  15. import org.springframework.jms.core.MessageCreator; 
  16.  
  17. public class SimpleJMSSender { 
  18.     private static final Log logger = LogFactory.getLog(SimpleJMSSender.class); 
  19.  
  20.     static int index = 0
  21.  
  22.     public static void main(String[] args) { 
  23.         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-send.xml"); 
  24.          
  25.         JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("myJmsTemplate"); 
  26.         for (int i = 0; i < 100; i++) { 
  27.             index = i; 
  28.             try { 
  29.                 jmsTemplate.send(new MessageCreator() { 
  30.                     public Message createMessage(Session session) throws JMSException { 
  31.                         TextMessage msg = session.createTextMessage(); 
  32.                         // 設置消息屬性 
  33.                         msg.setStringProperty("phrCode""C001  " + index); 
  34.                         // 設置消息內容 
  35.                         msg.setText("Hello World!  " + index); 
  36.                         logger.info("Send  " + index); 
  37.                         return msg; 
  38.                     } 
  39.                 }); 
  40.             } catch (JmsException e) { 
  41.                 System.exit(1); 
  42.             } 
  43.         } 
  44.     } 

 

接收者代碼:

  1. package com.xikang.jms; 
  2.  
  3. import javax.jms.JMSException; 
  4. import javax.jms.TextMessage; 
  5.  
  6. import org.apache.commons.logging.Log; 
  7. import org.apache.commons.logging.LogFactory; 
  8. import org.springframework.context.ApplicationContext; 
  9. import org.springframework.context.support.ClassPathXmlApplicationContext; 
  10. import org.springframework.jms.JmsException; 
  11.  
  12. public class SimpleJMSReceiver { 
  13.     private static final Log logger = LogFactory.getLog(SimpleJMSReceiver.class); 
  14.  
  15.     public static void main(String[] args) throws InterruptedException { 
  16.         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-receive.xml"); 
  17.         while(true) { 
  18.             Thread.sleep(100); 
  19.         } 
  20.     } 
  21.      
  22.     public void receive(TextMessage message) throws JmsException, JMSException { 
  23.         logger.info(message.getText()); 
  24.     } 

 

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