天天看點

Blazeds+JMS(ActiveMQ)+Spring實作消息

  1. 為什麼要消息?

工行直連要用到深證通資料交換平台(MDEP),MDEP的請求是不同步的。托管行每天會推過來一些頭寸報表資訊,這些資訊要及時的反應給業務人員。另外,檔案掃描和預警都要及時的通知給業務人員。是以,平台利用Blazeds的消息。值得說明的一點是:BlazeDS 是一個基于伺服器的 Java 遠端控制 (remoting) 和 Web 消息傳遞 (messaging) 技術,以LGPL(Lesser GNU Public License)公共許可證書釋出。它能夠使得後端的 Java 應用程式和運作在浏覽器上的 Adobe Flex 應用程式互相通信。在Java應用伺服器上,它以servlet的形式存在, 是以可以在任何标準Java網絡應用中運用它。Blazeds的消息機制是采用不斷的輪詢來實作的,是以性能不怎麼好,并發數最大為100,LCDS的消息機制是采用java的NIO,最高并發數是1000,Blazeds和LCDS相比性能還是比較差的,不過***系統的使用者數比較少的情況下,Blazeds還是可以的,畢竟,客戶都是比較吝啬的,有免費的肯定不想掏錢買昂貴的LCDS。

    2. 消息擴充卡該用哪一個?

Java代碼  

Blazeds+JMS(ActiveMQ)+Spring實作消息
  1. <adapters>  
  2.         <adapter-definition id="actionscript"  
  3.             class="flex.messaging.services.messaging.adapters.ActionScriptAdapter"  
  4.             default="true" />  
  5.         <adapter-definition id="jms"  
  6.             class="flex.messaging.services.messaging.adapters.JMSAdapter" />  
  7.     </adapters>  

Blazeds提供了兩種消息擴充卡,actionscript和jms.項目一期用的是actionscript擴充卡,但是有的時候發現檔案掃描的消息不能發送到用戶端,一直也沒有找到原因,關鍵是Log裡面找不到原因。二期應該會有大量的消息要推送到前端,是以打算用jms消息擴充卡。消息先發送到消息伺服器上,flex端訂閱消息,如果伺服器上有消息在用戶端就顯示出來。消息伺服器很多都是收費的,開源的有ActiveMQ、OPENJMS等。

   3.消息伺服器該用哪個?

 ActiveMQ 是Apache的産品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支援JMS1.1和J2EE 1.4規範的 JMS Provider實作,盡管JMS規範出台已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演着特殊的地位。在網上查閱了一下關于ActiveMQ 的文檔也比較多,而且是開放源代碼的,blazeds的官方文檔上的例子就是用的ActiveMQ作為消息伺服器,是以消息伺服器就選它了。

   4. 如何搭建環境?

      首先要在J2EE伺服器(tomcat6)中提供消息服務(JNDI)。在WebRoot/WETA-INFw檔案夾下建立一個context.xml.檔案的内容如下:

Xml代碼  

Blazeds+JMS(ActiveMQ)+Spring實作消息
  1. <Context privileged="true" antiResourceLocking="false"  
  2.     antiJARLocking="false" reloadable="false">  
  3.     <!-- Resourced needed for JMS -->  
  4.     <Resource name="jms/flex/TopicConnectionFactory"  
  5.         type="org.apache.activemq.ActiveMQConnectionFactory"  
  6.         description="JMS Connection Factory"  
  7.         factory="org.apache.activemq.jndi.JNDIReferenceFactory"  
  8.         brokerURL="tcp://localhost:61616"  
  9.         brokerName="LocalActiveMQBroker" />  
  10.     <Resource name="jms/topic/flex/simpletopic"  
  11.         type="org.apache.activemq.command.ActiveMQTopic"  
  12.         description="my Topic"  
  13.         factory="org.apache.activemq.jndi.JNDIReferenceFactory"  
  14.         physicalName="FlexTopic" />  
  15.     <Resource name="jms/flex/QueueConnectionFactory"  
  16.         type="org.apache.activemq.ActiveMQConnectionFactory"  
  17.         description="JMS Connection Factory"  
  18.         factory="org.apache.activemq.jndi.JNDIReferenceFactory"  
  19.         brokerURL="tcp://localhost:61616"  
  20.         brokerName="LocalActiveMQBroker" />  
  21.     <Resource name="jms/queue/flex/simplequeue"  
  22.         type="org.apache.activemq.command.ActiveMQQueue"  
  23.         description="my Queue"  
  24.         factory="org.apache.activemq.jndi.JNDIReferenceFactory"  
  25.         physicalName="FlexQueue" />  
  26.     <!--  
  27.     <Valve className="flex.messaging.security.TomcatValve" /> 
  28.      -->  
  29. </Context>  

      備注:其實通過上面的配置後,在tomcat6\conf\Catalina\localhost檔案下生成了一個utmost.xml檔案。關于上面的配置,請繼續關注我的部落格,我會在以後的寫部落格的。

     修改WEB-INF/flex/messaging-config.xml檔案。

Java代碼  

Blazeds+JMS(ActiveMQ)+Spring實作消息
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <service id="message-service" class="flex.messaging.services.MessageService">  
  3.     <adapters>  
  4.         <adapter-definition id="actionscript"  
  5.             class="flex.messaging.services.messaging.adapters.ActionScriptAdapter"  
  6.             default="false" />  
  7.         <adapter-definition id="jms"  
  8.             class="flex.messaging.services.messaging.adapters.JMSAdapter"  
  9.             default="true" />  
  10.     </adapters>  
  11.     <default-channels>  
  12.         <channel ref="my-streaming-amf" />  
  13.         <channel ref="my-polling-amf" />  
  14.     </default-channels>  
  15.     <destination id="scanfile" />  
  16.     <!-- active MQ stock feed -->  
  17.     <destination id="jmsamc"">  
  18.         <adapter ref="jms" />  
  19.         <properties>  
  20.             <!--這裡的配置是最關鍵的,隻有durable屬性設計為true才能實作持久化訂閱-->  
  21.             <server>  
  22.                 <durable>true</durable>  
  23.             </server>  
  24.             <jms>  
  25.                 <connection-factory>  
  26.                     java:comp/env/jms/flex/TopicConnectionFactory  
  27.                 </connection-factory>  
  28.                 <destination-type>Topic</destination-type>  
  29.                 <destination-jndi-name>  
  30.                     java:comp/env/jms/topic/flex/simpletopic  
  31.                 </destination-jndi-name>  
  32.                 <message-type>javax.jms.TextMessage</message-type>  
  33.                 <!-- 持久性 -->  
  34.                 <delivery-mode>PERSISTENT</delivery-mode>  
  35.                 <!-- 優先級  -->  
  36.                 <message-priority>DEFAULT_PRIORITY</message-priority>  
  37.                 <!--應答模式   -->  
  38.                 <acknowledge-mode>AUTO_ACKNOWLEDGE</acknowledge-mode>  
  39.                 <initial-context-environment>  
  40.                     <property>  
  41.                         <name>Context.SECURITY_PRINCIPAL</name>  
  42.                         <value>anonymous</value>  
  43.                     </property>  
  44.                     <property>  
  45.                         <name>Context.SECURITY_CREDENTIALS</name>  
  46.                         <value>anonymous</value>  
  47.                     </property>  
  48.                     <property>  
  49.                         <name>Context.INITIAL_CONTEXT_FACTORY</name>  
  50.                         <value>  
  51.                             org.apache.activemq.jndi.ActiveMQInitialContextFactory  
  52.                         </value>  
  53.                     </property>  
  54.                     <property>  
  55.                         <name>Context.PROVIDER_URL</name>  
  56.                         <value>tcp://192.168.124.114:61616</value>  
  57.                     </property>  
  58.                 </initial-context-environment>  
  59.             </jms>  
  60.         </properties>  
  61.         <channels>  
  62.             <channel ref="my-polling-amf" />  
  63.             <channel ref="my-streaming-amf" />  
  64.         </channels>  
  65.     </destination>  
  66. </service>  

felx前端訂閱消息

Java代碼  

Blazeds+JMS(ActiveMQ)+Spring實作消息
  1. <mx:ChannelSet id="cs">   
  2.         <mx:AMFChannel url="http://192.168.124.114:8099/utmost/messagebroker/amfpolling"/>   
  3.         <mx:AMFChannel url="http://192.168.124.114:8099/utmost/messagebroker/streamingamf"/>   
  4.     </mx:ChannelSet>   
  5.     <mx:Consumer id="consumer" destination="jmsamc" channelSet="{cs}"   
  6.          message="messageHandler(event.message)" selector=""/>   

通過以上的配置,基本上實作了Blazeds和JMS的結合。但是還沒有解決二期項目的問題,伺服器一啟動,檔案掃描就應該開始;預警是達到一定時間要發送消息給用戶端的;ActiveMQ怎麼交給Spring管理。下面幾篇文章,将會帶你慢慢解決這些問題。

      目前,J2EE 項目中基本上都用到Spring,Spring整合Blazeds實作ActiveMQ JMS消息服務,如果想進一步了解Blazeds的JMS消息服務,請大家參考我這篇部落格。