Flex經過Blazeds利用Remoteservice與後臺java消息推送

Flex經過Blazeds利用Remoteservice與後臺java消息推送前端

準備工做:Myeclipse中先創建一個Web project工程,而後導入Blazeds的文件,再轉換爲Flex項目類型。
前言:Flex 經過開源的 BlazeDS消息服務來支持訂閱及發佈消息。這個消息服務管理着Flex客戶端能夠訂閱或發佈的目標地址。Flex提供了 Producer和Consumer這兩個組件,讓你用來向目標地址發送或訂閱消息。若是要訂閱消息,你就使用Consumer類的 subscribe()方法。當有消息發送到你訂閱了的目標地址時,Consumer上就會觸發message事件。
消息傳遞的目標地址是在 Flex應用根下一個叫messaging-config.xml中配置的。一個目標地址配置的關鍵元素是在客戶端和服務器創建交換數據的通道。使用BlazeDS,消息傳遞的目標地址一般使用流通道或者輪詢通道。
 
1, 使用流通道,服務器響應會一直保持開放狀態,直到通道鏈接關閉,這樣能夠讓服務器持續向客戶端發送變化的數據。
2,若是數據沒有馬上準備好(長輪詢),就能夠經過一個簡單的時間間隔或者服務器等待時間來配置 輪詢通道。
修改兩個配置文件services-config.xml,messaging-config.xml
services-config.xml 加入如下代碼:
 
  
  
  
  
  1. <channel-definition id="my-streaming-amf" class="mx.messaging.channels.StreamingAMFChannel">   
  2. <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf" class="flex.messaging.endpoints.StreamingAMFEndpoint"/>   
  3.     <properties> 
  4.           <idle-timeout-minutes>0</idle-timeout-minutes> 
  5.           <max-streaming-clients>10</max-streaming-clients> 
  6. <server-to-client-heartbeat-millis>5000  
  7. </server-to-client-heartbeat-millis> 
  8.       <user-agent-settings> 
  9.        <user-agent match-on="MSIE" kickstart-bytes="2048" max-streaming-connections-per-session="1"/> 
  10.        <user-agent match-on="Firefox" kickstart-bytes="2048" max-streaming-connections-per-session="1"/> 
  11.        </user-agent-settings> 
  12.      </properties> 
  13. </channel-definition>   
messaging-config.xml 加入如下代碼
 
  
  
  
  
  1. <destination id="message-data-feed"> 
  2.        <properties> 
  3.         <server> 
  4.            <allow-subtopics>true</allow-subtopics> 
  5.            <subtopic-separator>.</subtopic-separator> 
  6.         </server> 
  7.       </properties> 
  8.       <channels> 
  9.            <channel ref="my-polling-amf" /> 
  10.            <channel ref="my-streaming-amf" /> 
  11.       </channels> 
  12. </destination> 
注:這裏的 id就是目標地址,也就是在flex代碼中須要訂閱消息的Consumer的屬性destination所要設置的值,以及發佈消息java後臺代碼AsyncMessage的setDestination()所要傳遞的參數,必須保證這三個地方名稱一致。正是經過這一個目標地址,信息發佈者就會將信息發佈到該目標地址,而後全部已經設置訂閱了該目標地址的flex就會觸發MessageEvent.MESSAGE事件,來獲取發佈的消息。
Flex前端代碼:
 
  
  
  
  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"   
  3.               xmlns:s="library://ns.adobe.com/flex/spark"   
  4.               xmlns:mx="library://ns.adobe.com/flex/mx"   
  5. minWidth="955" minHeight="600"> 
  6.     <fx:Script> 
  7.        <![CDATA[  
  8.            import mx.messaging.Channel;  
  9.            import mx.messaging.ChannelSet;  
  10.            import mx.messaging.Consumer;  
  11.            import mx.messaging.events.MessageEvent;  
  12.            import mx.rpc.events.ResultEvent;   
  13.            private var myConsumer:Consumer = new Consumer();   
  14.          
  15.            //直接利用Remote來進行遠程的消息調用  
  16.            //開始訂閱消息  
  17.            protected function rbt_clickHandler(event:MouseEvent):void  
  18.            {  
  19.               // TODO Auto-generated method stub  
  20.               //利用遠程調用來觸發開始工做  
  21.               subMessage.startSendMessage("start");  
  22.               //準備開始訂閱消息  
  23.         myConsumer.destination = " message -data-feed";   
  24. //這裏也要與後臺的主題名稱必須相同  
  25.         myConsumer.subtopic = "tick";   
  26.         myConsumer.channelSet = new ChannelSet(["my-streaming-amf"]);   
  27.         myConsumer.addEventListener(MessageEvent.MESSAGE, remote_messageHandler);   
  28.         myConsumer.subscribe();   
  29.         }  
  30. //獲取訂閱的消息,以文原本顯示顯示  
  31. private function remote_messageHandler(event:MessageEvent):void   
  32.  
  33.         var mess:String = event.message.body as String;   
  34.         demot.appendText("\n"+ mess);  
  35.  
  36. //退訂該消息  
  37. protected function cbr_clickHandler(event:MouseEvent):void  
  38. {  
  39.         subMessage.stopSendMessage("stop");  
  40.         myConsumer.unsubscribe(false);  
  41. }  
  42. protected function subMessage_resultHandler(event:ResultEvent):void  
  43. {}
  44. ]]> 
  45. </fx:Script> 
  46. <fx:Declarations> 
  47.      <!—用來啓動消息發佈 --> 
  48. <mx:RemoteObject id="subMessage" destination="RemoteMessage"   
  49.     result="subMessage_resultHandler(event)"> </mx:RemoteObject> 
  50. </fx:Declarations> 
  51.     <s:TextArea x="445" y="42" width="257" id="demot"/> 
  52.     <s:Button x="445" y="210" label="訂閱消息Remote" id="rbt" click="rbt_clickHandler(event)"/> 
  53.     <s:Button x="597" y="207" label="退訂消息R" id="cbr" click="cbr_clickHandler(event)"/> 
  54. </s:Application> 
 
Java 後臺代碼:
  
  
  
  
  1. package com.whut.daemon;  
  2. import flex.messaging.MessageBroker;  
  3. import flex.messaging.messages.AsyncMessage;  
  4. import flex.messaging.util.UUIDUtils;  
  5. public class DaemonMessage {  
  6.     private static FeedThread thread;  
  7.     //開始傳遞消息  
  8.     public void startSendMessage(String flags)  
  9.     {  
  10.        if (thread == null)   
  11.        {  
  12.            thread = new FeedThread();  
  13.            thread.start();  
  14.        }  
  15.     }  
  16.     //中止消息發佈  
  17.     public void stopSendMessage(String flags)  
  18.     {  
  19.        thread.running=false;  
  20.        thread=null;  
  21.     }  
  22.     public static class FeedThread extends Thread   
  23.     {  
  24.        public boolean running = true;  
  25.        public void run() {  
  26.            MessageBroker msgBroker = MessageBroker.getMessageBroker(null);  
  27.            String clientID = UUIDUtils.createUUID();  
  28.            System.out.println("clientID="+clientID);  
  29.            while (running) {  
  30.               //異步消息  
  31.               AsyncMessage msg = new AsyncMessage();  
  32.               msg.setDestination("tick-data-feed111");  
  33.               msg.setHeader("DSSubtopic""tick");  
  34.               msg.setClientId(clientID);  
  35.               msg.setMessageId(UUIDUtils.createUUID());  
  36.               msg.setTimestamp(System.currentTimeMillis());  
  37.               msg.setBody("hello");  
  38.               msgBroker.routeMessageToService(msg, null);  
  39.               try {  
  40.                   Thread.sleep(500);  
  41.               } catch (InterruptedException e) {}}}}}  
remoting-config.xml 加入如下代碼:
 
  
  
  
  
  1. <destination id="RemoteMessage"> 
  2.  <properties> 
  3.       <source>com.whut.daemon.DaemonMessage</source> 
  4.   </properties> 
  5. </destination>
相關文章
相關標籤/搜索