Jencks2.0 + activeMQ4.1 使用手記

自打Spring2出來後一直使用其自帶的MDP功能,當時使用的JMS產品是Joram,後來實在受不了Joram持久化機制和莫名其妙的不能啓動服務器等,狠一狠心換成口碑日佳的ActiveMQ。ActiveMQ在使用方面竟比我想像中的簡單!但這種簡單來得可不簡單,你需要反覆翻他的文檔。搞了好久後看着那簡潔的配置和不用提心吊膽的Server,真有相見恨晚的感覺。
使用ActiveMQ,很難不知道有Jencks這個東西。我在之前只是簡單的知道該JCA產品可以實現Message driven Pojo,但想想Spring也能做到的東西我爲什麼用另一套,看了Jencks的FAQ就清楚了:
www.jencks.org/How+does+Jencks+compare+to+Springs+MDPs
偶翻譯能力太差,大概瞭解但不知道要乍講。看官們還是自個看看吧:P。

Jencks2.0版本的配置比1.X的配置來得清爽很多。
1.X版本的可參考Springside的Wiki (XSD版):
http://www.jencks.org/How+does+Jencks+compare+to+Springs+MDPs
另外可以參考Javaeye另一位仁兄的嘗試(Spring  Bean版 ):
jamsa.iteye.com/blog/post/168023
Jamsa的示例中只演示了Inboud 的情況,實際上Jencks是可以包括Inbound outbound的Message的。

我的目標是使用Jencks2.0實現MDP及對Outbound Message的管理,參考官方文檔很快可以把配置做出來:
www.jencks.org/Message+Driven+POJOs
www.jencks.org/Outbound+JMS

貼一下我的配置文件全貌:
xml 代碼
 
  1. xml version="1.0" encoding="UTF-8"?>  
  2.     "http://www.springframework.org/dtd/spring-beans-2.0.dtd">  
  3.   
  4. <beans>  
  5.       
  6.     <bean id="jmsTransactionManager"  
  7.         class="org.jencks.factory.TransactionManagerFactoryBean" />  
  8.           
  9.       
  10.     <bean id="connectionManager"  
  11.         class="org.jencks.factory.ConnectionManagerFactoryBean">  
  12.         <property name="transactionManager" ref="jmsTransactionManager" />  
  13.     bean>  
  14.   
  15.     <bean id="jmsResourceAdapter"  
  16.         class="org.apache.activemq.ra.ActiveMQResourceAdapter">  
  17.         <property name="serverUrl">  
  18.             <value>tcp://localhost:61616value>  
  19.         property>  
  20.     bean>  
  21.   
  22.     <bean id="jmsManagedConnectionFactory"  
  23.         class="org.apache.activemq.ra.ActiveMQManagedConnectionFactory">  
  24.         <property name="resourceAdapter" ref="jmsResourceAdapter" />  
  25.     bean>  
  26.   
  27.     <bean id="connectionFactory"  
  28.         class="org.jencks.factory.ConnectionFactoryFactoryBean">  
  29.         <property name="managedConnectionFactory"  
  30.             ref="jmsManagedConnectionFactory" />  
  31.         <property name="connectionManager" ref="connectionManager" />  
  32.     bean>  
  33.       
  34.       
  35.       
  36.     <bean id="jmsTemplate"  
  37.         class="org.springframework.jms.core.JmsTemplate">  
  38.         <property name="connectionFactory">  
  39.             <ref bean="connectionFactory" />  
  40.         property>  
  41.     bean>  
  42.   
  43.     <bean id="sender" class="net.jf.activemq.Sender">  
  44.         <property name="jmsTemplate" ref="jmsTemplate" />  
  45.         <property name="queue">  
  46.             <value>queue.textvalue>  
  47.         property>  
  48.     bean>  
  49.       
  50.       
  51.       
  52.     <bean id="receiver" class="net.jf.activemq.Receiver" />
  53.   
  54.     <bean id="jencks" class="org.jencks.JCAContainer">  
  55.         <property name="transactionManager" ref="jmsTransactionManager" />  
  56.         <property name="threadPoolSize" value="25" />  
  57.   
  58.           
  59.         <property name="resourceAdapter" ref="jmsResourceAdapter" />  
  60.     bean>  
  61.   
  62.     <bean id="inboundConnectorA" class="org.jencks.JCAConnector">  
  63.         <property name="jcaContainer" ref="jencks" />  
  64.           
  65.         <property name="activationSpec">  
  66.             <bean  
  67.                 class="org.apache.activemq.ra.ActiveMQActivationSpec">  
  68.                 <property name="destination" value="queue.text" />  
  69.                 <property name="destinationType"  
  70.                     value="javax.jms.Queue" />  
  71.             bean>  
  72.         property>  
  73.         <property name="ref" value="receiver" />  
  74.     bean>  
  75.       
  76. beans>  
注意inbound 及outboud的資源適配器使用相同的適配器。多數情況下,JMS的發送方及接收方配置分開,但注意當同時使用Jencks管理髮送消息方及接收方時,要保持resourceAdepter的一致!

還一件事你一定要知道。要不你會跟我一樣抓狂上好幾天。就是Jencks2.0的依賴包的問題。
找遍Jencks2.0下載回來的包,其實還是差兩個很重要的包。那就是geronimo-transaction和geronimo-connector包。而Jencks官網對此沒有提及,很鬱悶。
我在尋找這兩個包的過程中下編了geronimo的幾個版本都沒發現,然後到這裏找到他們的1.1版本。運行時發現缺少類,該類是屬於Transaction包內的類,分明包內沒有此類:\org\apache\geronimo\transaction\manager\XAWork。Google一下,結果奇少。我想應該是包版本問題,而Maven的倉庫只有1.2Beta版本的,我下來一看也沒這個類,於是沒有替換掉,繼續使用1.1版。
後來找到這個類是Transatction包的2.0版本纔有的,我趕緊SVN了Geronimo最新的源碼回來,自己Build了個快照的版本。其實是兩個:
geronimo-connector-2.0-SNAPSHOT.jar
geronimo-transaction-1.2-SNAPSHOT.jar
而後來發生的問題幾乎要推翻我的Java信仰。運行時報的錯是NoSuchMethodError,告訴我缺少一個方法。而分明那個類,那個方法是存在的。我很確定在我的類庫裏,這個類只存在一個版本。我實在沒有辦法了,我開始懷疑2.0的成熟性。但是還沒有放棄最後的希望,我又SVN了一份Jencks的最新代碼回來。用Maven跑一跑,所有測試都沒問題。而這時發現它只是用了Transaction及Connector的1.2的包。我決定最後一博,把這兩個包替換掉2.0的包。奇蹟啊,哥們,終於久違的“Hello activeMQ”打印了出來。
至今我還沒想明白怎麼現在又不報缺XAWork?爲什麼存在的方法是被報不存在?不過最後終於跑起來了,很爽。
所以不要怪我上面那一番沒章法的抱怨。這樣的問題讓我幾近崩潰。我覺得我有必要把過程寫出來與大家分享。讓後來的朋友能快速地解決問題。
實際上,我在看MailList的時候看到過一封類似問題的郵件,我其實只要按方法用1.2換掉1.1的Connector和Trasaction就得了。但我死活認爲非要找到XAWork的包纔行。而最後解決的方法卻是沒必要找到XAWork的包。額滴神啊。我現在還想不明白爲啥。望哪位看官能指點迷津!
最後附上我的Lib(這是最重要D):
activeio-core-3.0.0-incubator.jar
activemq-console-4.1.1.jar
activemq-core-4.1.1.jar
activemq-core-4.1.1-tests.jar
activemq-jaas-4.1.1.jar
activemq-ra-4.1.1.jar
activemq-web-4.1.1.jar
backport-util-concurrent-2.1.jar
commons-logging-1.1.jar
geronimo-connector-1.2-beta.jar
geronimo-j2ee-connector_1.5_spec-1.0.1.jar
geronimo-j2ee-management_1.0_spec-1.0.jar
geronimo-jms_1.1_spec-1.0.jar
geronimo-jta_1.0.1B_spec-1.0.1.jar
geronimo-transaction-1.2-beta.jar
jencks-2.0-all.jar
jencks-amqpool-2.0.jar
log4j-1.2.12.jar
mx4j-2.1.1.jar
spring-2.0.jar
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章