當柳上原的風吹向天際的時候...

          真正的快樂來源于創造

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
          相對于Weblogic這種大家伙來說,在ActiveMQ5.3.0上建立隊列和主題還是相對容易的,當然如果路沒走對也要費一番周折,本人在此寫出小文,希望能對ActiveMQ初學者有所裨益,順便感謝網絡上那些辛勤的有共享精神的ActiveMQ研究者和鄙視一下那些懶惰的有剽竊習慣的轉載者。

          一.下載安裝ActiveMQ
          http://activemq.apache.org/ 你可以得到ActiveMQ的最新版本,本人下載的是win版本,下載到本地后解壓到一個目錄(以后簡稱ActiveMQ解壓目錄)就算安裝完畢了,確實很簡單。

          二.啟動ActiveMQ。
          啟動它也很容易,找到ActiveMQ解壓目錄下的bin目錄,雙擊activemq.bat就可以了,如果嫌麻煩可以做成一個批處理文件,然后讓計劃任務自動調用它。activemq.bat啟動后會出現一個命令行窗口,這意味著broker已經準備就緒了。

          三.創建隊列和主題
          ActiveMQ啟動后,我們可以就使用 http://localhost:8161/admin 進入ActiveMQ的消息管理后臺系統,如下圖:

          在這個頁面中有一排橫向菜單,如果你需要創建隊列Queue,點擊Queues菜單,輸入你想要的隊列的名稱,再點擊Create按鈕,隊列即被創建好了;主題也很類似,你點擊Topics菜單,輸入你想要的主題的名稱,再點擊create按鈕,主題也就建立好了。確實是非常快捷方便。本人建立了隊列DealQueue和主題BuyTopic,用于下面的程序。

          四.利用隊列和主題收發消息
          有了Spring的幫助,JMS處理能省卻很多功夫,我們只需要進行對應的配置即可,下面是通過隊列DealQueue和主題BuyTopic收發消息的配置和消息發送器監聽器源代碼,大家可以參考,另外也可以從這 這里(注意為了減小體積,包都被刪除了,請到ActiveMQ安裝目錄的lib尋找相應的包載入,其它通用包請自行尋找)    下載源碼查看。

          Spring上下文配置文件bean.xml,這里文件里配置的有連接工廠,jms模板,目的地,消息發送者和接受者等。
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

          <beans>
              
          <!-- 連接工廠 -->
              
          <bean id="connectionFactory"
                  class
          ="org.apache.activemq.ActiveMQConnectionFactory">
                  
          <property name="brokerURL">
                      
          <value>tcp://192.168.0.1:61616</value>
                  
          </property>

              
          </bean>

              
          <!-- JMS模板 -->
              
          <bean id="jmsTemplate"
                  class
          ="org.springframework.jms.core.JmsTemplate">
                  
          <property name="connectionFactory">
                      
          <ref bean="connectionFactory" />
                  
          </property>
              
          </bean>

              
          <!-- **************************** -->
              
          <!--     以下是隊列DealQueue的配置   -->
              
          <!-- **************************** -->
              
          <!-- 在ActiveMQ上配置的隊列DealQueue -->
              
          <bean id="dest4DealQueue"
                  class
          ="org.apache.activemq.command.ActiveMQQueue">
                  
          <constructor-arg index="0">
                      
          <value>DealQueue</value>
                  
          </constructor-arg>
              
          </bean>
              
              
          <!-- JMS 消息發送者 ,用于給DealQueue發送消息 -->
              
          <bean id="jmsSender4DealQueue"
                  class
          ="com.heyang.sender.JmsSender">
                  
          <property name="jmsTemplate" ref="jmsTemplate" />
                  
          <property name="destination" ref="dest4DealQueue" />
              
          </bean> 
              
              
          <!-- JMS 消息監聽容器,Spring容器啟動后自行監聽DealQueue,有消息后會交給dealQueueListener處理 -->
              
          <bean id="listenerContainer4DealQueue"
                  class
          ="org.springframework.jms.listener.DefaultMessageListenerContainer">        
                  
          <property name="connectionFactory" ref="connectionFactory" />
                  
          <property name="concurrentConsumers" value="1" />
                  
          <property name="destination" ref="dest4DealQueue" />
                  
          <property name="messageListener" ref="dealQueueListener" />
              
          </bean>
              
              
          <!-- MDP:用于接收DealQueue上的消息 -->
              
          <bean id="dealQueueListener" class="com.heyang.listener.DealQueueListener" />
              
              
          <!-- **************************** -->
              
          <!--     以下是主題BuyTopic的配置   -->
              
          <!-- **************************** -->
              
          <!-- 在ActiveMQ上配置的主題 -->
              
          <bean id="dest4BuyTopic"
                  class
          ="org.apache.activemq.command.ActiveMQTopic">
                  
          <constructor-arg index="0">
                      
          <value>BuyTopic</value>
                  
          </constructor-arg>
              
          </bean>
              
              
          <!-- JMS 消息發送者 ,用于給BuyTopic發送消息 -->
              
          <bean id="jmsSender4BuyTopic"
                  class
          ="com.heyang.sender.JmsSender">
                  
          <property name="jmsTemplate" ref="jmsTemplate" />
                  
          <property name="destination" ref="dest4BuyTopic" />
              
          </bean> 
              
              
          <!-- JMS 消息監聽容器,Spring容器啟動后自行監聽BuyTopic,有消息后會交給buyTopicListener處理 -->
              
          <bean id="listenerContainer4BuyTopic"
                  class
          ="org.springframework.jms.listener.DefaultMessageListenerContainer">        
                  
          <property name="connectionFactory" ref="connectionFactory" />
                  
          <property name="concurrentConsumers" value="1" />
                  
          <property name="destination" ref="dest4BuyTopic" />
                  
          <property name="messageListener" ref="buyTopicListener" />
              
          </bean>
              
              
          <!-- MDP:用于接收BuyTopic上的消息 -->
              
          <bean id="buyTopicListener" class="com.heyang.listener.BuyTopicListener" />
          </beans>


          三個對應的類
          1.JMS消息發送者
          package com.heyang.sender;

          import javax.jms.Destination;
          import javax.jms.JMSException;
          import javax.jms.Session;

          import org.apache.activemq.Message;
          import org.springframework.jms.core.JmsTemplate;
          import org.springframework.jms.core.MessageCreator;

          /**
           * 此類用發送消息
           * 
          @author 何楊
           * @date 2009-10-15
           * @time 上午07:44:15
           
          */

          public class JmsSender {

              
          // JMS模板    
              private JmsTemplate jmsTemplate;

              
          // 目的地
              private Destination destination;

              
          public void send(final String msg) {
                  jmsTemplate.send(destination, 
          new MessageCreator() {
                      
          public Message createMessage(Session session) throws JMSException {
                          
          return (Message) session.createTextMessage(msg);
                      }

                  }
          );
              }


              
          public JmsTemplate getJmsTemplate() {
                  
          return jmsTemplate;
              }


              
          public void setJmsTemplate(JmsTemplate jmsTemplate) {
                  
          this.jmsTemplate = jmsTemplate;
              }


              
          public Destination getDestination() {
                  
          return destination;
              }


              
          public void setDestination(Destination destination) {
                  
          this.destination = destination;
              }

          }

          JMS消息監聽者,用于監聽BuyTopic:
          package com.heyang.listener;

          import javax.jms.Message;
          import javax.jms.MessageListener;
          import javax.jms.TextMessage;

          import org.apache.log4j.Logger;

          /**
           * JMS消息監聽者,用于監聽BuyTopic。
           * 
           * 
          @author 何楊
           * @date 2009-10-13
           * @time 下午04:10:33
           
          */

          public class BuyTopicListener implements MessageListener {
              
          public static Logger logger = Logger.getLogger(DealQueueListener.class);
              
              
          public void onMessage(Message message) {
                  
          if (message instanceof TextMessage) {            
                     
                      
          // 消息轉化
                      String msg="";
                      
          try{
                          msg
          =((TextMessage) message).getText();
                          System.out.println(
          "從BuyTopic收到消息:"+msg);
                      }
           catch (Exception ex) {
                          logger.error(ex);
                          ex.printStackTrace();
                          
          return;
                      }

                  }

              }

          }


          JMS消息監聽者,用于監聽DealQueue
          package com.heyang.listener;

          import javax.jms.Message;
          import javax.jms.MessageListener;
          import javax.jms.TextMessage;

          import org.apache.log4j.Logger;

          /**
           * JMS消息監聽者,用于監聽DealQueue。
           * 
           * 
          @author 何楊
           * @date 2009-10-13
           * @time 下午04:10:33
           
          */

          public class DealQueueListener implements MessageListener {
              
          public static Logger logger = Logger.getLogger(DealQueueListener.class);
              
              
          public void onMessage(Message message) {
                  
          if (message instanceof TextMessage) {            
                     
                      
          // 消息轉化
                      String msg="";
                      
          try{
                          msg
          =((TextMessage) message).getText();
                          System.out.println(
          "從DealQueue收到消息:"+msg);
                      }
           catch (Exception ex) {
                          logger.error(ex);
                          ex.printStackTrace();
                          
          return;
                      }

                  }

              }

          }

              

          用戶可以使用Test.java中的語句來測試一下效果。另外有一點想贅述一下,上述兩個消息監聽者是受Spring容器控制的,它們之所以能成為Message Diven Pojo是因為Spring容器自啟動開始就對目標進行輪詢,如果發現有消息就通知指定消息監聽者響應,這樣消息監聽者的onMessage函數就會被調用,其背后的調用者即上面配置文件中的listenerContainer4DealQueue和listenerContainer4BuyTopic,我們雖沒有直接使用它們但它們從Spring上下文啟動伊始就一直開始工作了,從log4j的輸出就能看出這一點,當然為了消除輪詢輸出的消極影響,你可以調高log4j的輸出級別。

          但愿此文能對你有所幫助,全文完。
          posted on 2009-10-27 09:00 何楊 閱讀(4140) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 丰都县| 龙岩市| 澄城县| 女性| 隆回县| 内江市| 天全县| 安岳县| 巴林右旗| 九江市| 马山县| 叙永县| 商南县| 新源县| 睢宁县| 唐海县| 沽源县| 太谷县| 绥德县| 泰和县| 安平县| 金阳县| 抚松县| 和顺县| 勐海县| 横峰县| 昭苏县| 绍兴县| 永德县| 河曲县| 连江县| 大渡口区| 新营市| 利川市| 且末县| 临猗县| 常熟市| 东宁县| 芜湖县| 洪泽县| 泊头市|