結合Spring2.0和ActiveMQ進行異步消息調用

 在Spring 2.0之前,Spring的JMS的作用侷限於產生消息。這個功能(封裝在 JmsTemplate 類中)當然是很好的, 但是,它沒有描述完整的JMS堆棧,比如像消息的 異步 產生和消耗。JMS堆棧缺少的這一部分已經被添加,Spring 2.0現在提供對消息異步消耗的完整支持。       讓我們從一個例子開始。       首先我們打開ActiveMQ。從ActiveMQ的安裝路徑上的bin目錄,那裏有一個ActiveMQ.bat,雙擊執行即可。不過要注意必須先設置java_home環境變量。ActiveMQ默認的服務端口是61616。       然後我們開始配置Spring配置文件。我起名爲spring-jms.xml
  1. 首先要配置一個ConnectionFactory代碼如下
    Copy code
    <bean id="connectionFactory"         class="org.apache.activemq.ActiveMQConnectionFactory">         <property name="brokerURL" value="tcp://localhost:61616" /> </bean>
      這裏用到的ConnectionFactory是ActiveMQ提供的工廠,爲了能使用這個工廠,我們必須在項目中添加以下幾個jar文件: geronimo-jms_1.1_spec-1.0.jar, activeio-core-3.0-beta3.jar, activemq-core-4.0.1.jar, backport-util-concurrent-2.1.jar, commons-logging-1.0.4.jar, geronimo-j2ee-management_1.0_spec-1.0.jar 以上這些Jar文件都存在於ActiveMQ安裝目錄的lib目錄下,這些可是我一個一個試驗出來的,累個半死。。
  2. 然後應該配置一個Queue(我使用的是點對點方式),不過ActiveMQ只要提供一個名字就可以自動創建隊列,因此這一步省了,呵呵
  3. 下面就輪到Spring的支持類了,首先是JmsTemplate。這個類提供了大量的方法簡化我們對JMS的操作。常用的有兩個,org.springframework.jms.core.JmsTemplate102和org.springframework.jms.core.JmsTemplate,這兩個類分別支持JMS的1.02版本和1.1版本。現在比較常用的還是1.02版本。配置如下
    Copy code
        <bean id="jmsTemplate"         class="org.springframework.jms.core.JmsTemplate102">         <property name="connectionFactory" ref="connectionFactory"/>         <property name="timeToLive" value="86400000"/>         <property name="defaultDestinationName" value="cmpp" />         <property name="messageConverter" ref="messageConverter" />         <property name="receiveTimeout" value="30000" />     </bean>
    上面的配置中用到了第一步配置的connectionFactory以及一個消息轉換的類messageConverter,這個類實現了org.springframework.jms.support.converter.MessageConverter接口,可以在消息發送之前和接受之後進行消息類型轉換。具體的看最後的實例代碼。配置代碼如下:
    Copy code
        <!-- Spring JMS SimpleConverter -->        <bean id="simpleConverter"  class="org.springframework.jms.support.converter.SimpleMessageConverter" /> <!-- Message Converter -->     <bean id="messageConverter"         class="com.liangj.apmgt.jms.ApmgtMessageConverter">         <property name="converter">             <ref local="simpleConverter" />         </property>     </bean>
    這裏還配置了發送的消息的存在時間timeToLive,目標Queue的名字defaultDestinationName,接受消息超時時間receiveTimeout
  4. 配置發送代碼
    Copy code
        <!-- Message porducer -->     <bean id="producer"         class="com.liangj.apmgt.jms.DefaultApmgtMessageProducer">         <property name="jmsTemplate" ref="jmsTemplate" />     </bean>
  5. 接着配置監聽器,這是Spring2.0新增的功能,配置如下:
    Copy code
        <!-- this is the Message Driven POJO (MDP) -->     <bean id="messageListener"         class="org.springframework.jms.listener.adapter.MessageListenerAdapter">         <constructor-arg>             <bean                 class="com.liangj.apmgt.jms.DefaultApmgtMessageListener" />         </constructor-arg>         <property name="defaultListenerMethod" value="onMessage" />         <property name="messageConverter" ref="messageConverter" />     </bean>     <!-- and this is the attendant message listener container -->     <bean id="listenerContainer"         class="org.springframework.jms.listener.DefaultMessageListenerContainer">         <property name="connectionFactory" ref="connectionFactory" />         <property name="destinationName" value="${jms.destinationName.cmpp}" />         <property name="messageSelector" value="${jms.messageSelector}" />         <property name="messageListener" ref="messageListener" />     </bean>

      Spring配置監聽器有很多種選擇,在這裏我選擇這回種MessageListenerAdapter方法主要是因爲這個方法比較靈活。實現他只要一個很普通的java類即可,和JMS以及Spring的耦合度最低。其中方法onMessage可以隨便修改方法名,只要在配置文件中對應的修改就好了。      MessageListenerAdapter還有一個功能就是如果處理方法(我這裏是onMessage)返回一個非空值,它將自動返回一個響應消息。這個消息會返回給JMS Reply-To屬性定義的目的地(如果存在),或者是MessageListenerAdapter設置(如果配置了)的缺省目的地;如果沒有定義目的地,那麼將產生一個InvalidDestinationException異常(此異常將不會只被捕獲而不處理,它沿着調用堆棧上傳)。      這樣我們的配置就都完成了。接下來我們來實現對應的Java文件先是接口文件發送消息接口IApmgtMessageProducer.java

http://blog.iecn.net/blog-html-do-showone-uid-30995-type-blog-itemid-1035.html

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