ActiveMQ4.1+Spring2.0的Message Driven POJO

來源:互聯網
上載者:User

作者:cctvx1,江南白衣

本文來自SpringSide WIki,請留意Wiki上的更新。

1.概述1.1 JMS與ActiveMQ特性  

   JMS始終在JavaEE五花八門的協議裡,WebService滿天飛的時候佔一位置,是因為它可以:

  • 可以把不影響使用者執行結果又比較耗時的任務(比如發郵件通知管理員)非同步扔給JMS 服務端,而儘快的把螢幕返還給使用者,且服務端能夠多線程排隊響應高並發的請求。
  • 可以在Java世界裡達到最高的解耦。用戶端與服務端無需直連,甚至無需知曉對方是誰、在哪裡、有多少人,只要對流過的資訊作響應就行了,在公司專屬應用程式環境複雜時作用明顯。

    ActiveMQ 的特性:

  • 完全支援JMS1.1和J2EE 1.4規範的 JMS Provider實現,也是Apache Geronimo預設的JMS provider。
  • POJO withdout EJB Container,不需要實現EJB繁瑣複雜的Message Bean介面和配置。
  • Spring Base,可以使用Spring的各種特性如IOC、AOP 。
  • Effective,基於Jencks的JCA Container實現 pool connection,control transactions and manage security。 
1.2 SpringSide 的完全POJO的JMS方案   

  SpringSide在BookStore樣本中,示範了使用者下訂單時,將發通知信到使用者郵箱的動作,通過JMS交給JMS服務端非同步完成,避免了郵件伺服器的堵塞而影響使用者的下訂。

  全部代碼於examples/bookstore/src/java/org/springside/bookstore/components/activemq 目錄中。

  一個JMS情境通常需要三者參與:

  • 一個POJO的的Message Producer,負責使用Spring的JMS Template發送訊息。
  • 一個Message Converter,負責把Java對象如訂單(Order)轉化為訊息,使得Producer能夠直接發送POJO。
  • 一個MDP Message Consumer,負責接收並處理訊息。

  SpringSide 2.0採用了ActiveMQ 4.1-incubator-SNAPSHOT 與Spring 2.0 整合,比SS 1.0M3版本有三個值得留意的特點,使得代碼中幾乎不見一絲JMS的侵入代碼:

  1. 採用Spring2.0的Schema式簡化配置。
  2. 實現Message Converter轉化訊息與對象,使得Producer能夠直接發送POJO而不是JMS Message。
  3. 使用了Spring的DefaultMessageListenerContainer與MessageListenerAdapter,訊息接收者不用實現MessageListener 介面。
2.引入ActiveMQ的XSD

  ActiveMQ4.1 響應Spring 2.0號召,支援了引入XML Schema namespace的簡單配置文法,簡化了配置的語句。 

  在ApplicationContext.xml(Spring的設定檔)中引入ActiveMQ的XML Scheam 設定檔),如下:

<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:amq="http://activemq.org/config/1.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://activemq.org/config/1.0 http://people.apache.org/repository/org.apache.activemq/xsds/activemq-core-4.1-incubator-SNAPSHOT.xsd">
由於ActiveMQ的那個XSD有部分錯誤,因此使用的是自行修改過的XSD,配置ClassPath中的schema.

在ClassPath 下面建立META-INF/spring.schemas 內容如下。這個spring.schemas是spring自訂scheam的設定檔,請注意"http:/://"部分寫法

http/://people.apache.org/repository/org.apache.activemq/xsds/activemq-core-4.1-incubator-SNAPSHOT.xsd=/activemq-core-4.1-incubator-SNAPSHOT.xsd

3. 配置方案3.1 基礎零件 

1. 配置ActiveMQ Broker  

   暫時採用在JVM中嵌入這種最簡單的模式,  當spring初始化時候,ActiveMQ embedded Broker 就會啟動了。

<!--  lets create an embedded ActiveMQ Broker -->
 <amq:broker useJmx="false" persistent="false">
      <amq:transportConnectors>
            <amq:transportConnector uri="tcp://localhost:0"/>
     </amq:transportConnectors>
 </amq:broker>

 

2. 配置(A)ConnectionFactory

  由於前面配置的Broker是JVM embedded 所以URL為:vm://localhost

<!--  ActiveMQ connectionFactory to use  -->
 <amq:connectionFactory id="jmsConnectionFactory" brokerURL="vm://localhost"/>

3 配置(B)Queue

<!--  ActiveMQ destinations to use  -->
 <amq:queue name="destination" physicalName="org.apache.activemq.spring.Test.spring.embedded"/> 

 

4. 配置(C)Converter

   配置Conveter,使得Producer能夠直接發送Order對象,而不是JMS的Message對象。

<!--  OrderMessage converter  -->
 <bean id="orderMessageConverter" class="org.springside.bookstore.components.activemq.OrderMessageConverter"/>  

 

3.2  發送端 

1 配置JmsTemplate

   Spring提供的Template,綁定了(A)ConnectionFactory與(C)Converter。

<!--  Spring JmsTemplate config -->
 <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  <property name="connectionFactory">
   <!--  lets wrap in a pool to avoid creating a connection per send -->
   <bean class="org.springframework.jms.connection.SingleConnectionFactory">
    <property name="targetConnectionFactory" ref="jmsConnectionFactory"/>
   </bean>
  </property>
  <!-- custom MessageConverter -->
  <property name="messageConverter" ref="orderMessageConverter"/>
 </bean>

 

2.Producer

   訊息寄件者,使用JmsTemplate發送訊息,綁定了JmsTemplate(含A、C 與(B)Queue。

<!-- POJO which send Message uses  Spring JmsTemplate,綁定JMSTemplate 與Queue -->
 <bean id="orderMessageProducer" class="org.springside.bookstore.components.activemq.OrderMessageProducer">
  <property name="template" ref="jmsTemplate"/>
  <property name="destination" ref="destination"/>
 </bean>

 

3.3 接收端

  1.接收處理者(MDP)

    使用Spring的MessageListenerAdapter,指定負責處理訊息的POJO及其方法名,綁定(C)Converter。

 

  <!--  Message Driven POJO (MDP),綁定Converter -->
 <bean id="messageListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
  <constructor-arg>
   <bean class="org.springside.bookstore.components.activemq.OrderMessageConsumer">
    <property name="mailService" ref="mailService"/>
   </bean>
  </constructor-arg>
  <!--  may be other method -->
  <property name="defaultListenerMethod" value="sendEmail"/>
  <!-- custom MessageConverter define -->
  <property name="messageConverter" ref="orderMessageConverter"/>
 </bean> 

 

2. listenerContainer

    負責調度MDP, 綁定(A) connectionFactory, (B)Queue和接收處理者(MDP)。

 

<!--  this is the attendant message listener container -->
 <bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="connectionFactory" ref="jmsConnectionFactory"/>
  <property name="destination" ref="destination"/>
  <property name="messageListener" ref="messageListener"/>
 </bean>

 

  互相綁定的關係有點暈,發送端和接收端都以不同形式綁定了(A) connectionFactory, (B)Queue和 (C)Converter.

 

 

 上半章完,關於Jencks(JCA Server)與持久化請等待下半章。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.