關於Flex的MessageBroker Endpoints channels的配置運用

MessageBroker 我們稱他爲信息經紀人,它職責就是把messages 發給到services 就是我們的程序服務,它是BlazeDs在服務器上的核心。endpoint 處理完一個request,也即是把messages 從request抽取出來,然後傳給MessageBroker ,然後MessageBroker 就檢測這個消息的destination ,接着把它傳給它想到的服務目的地。假若我們的服務有安全保護,MessageBroker 要先運行authentication ,authentication 是在信息傳遞前先做check。你要在你BlazeDS  WEB應用WEB-INF/web.xml 文件中配置你的MessageBroker。

   Endpoints

       BlazeDS 基於servlet的Endpoints(端點)是在J2EE servlet container中的,這就意味着 servlet 爲 endpoints操縱着 the I/O and HTTP sessions ,實際上Endpoints被MessageBrokerServlet控制,除了MessageBrokerServlet,我們的 J2EE server還在web.xml文件中註冊一個 HTTP session 監聽者,以使BlazeDS 有監聽的屬性,和支持。BlazeDS Flex 客戶端用channels (通道)和endpoints通信,在服務器上,channels 和endpoints有一對一的對應關係,也許因爲他們兩個用的數據格式要一樣。比如一個channels 用 AMF消息格式,如AMFChannel格式,必須有一個也用這種格式的endpoints與它配對。同樣一個用了AMFX  格式的channels  也要求有一個同樣格式的endpoint。你要在你BlazeDS  WEB應用WEB-INF/flex directory的 services-config.xml 文件中配置你的endpoints。

channels

       channels 是客戶端的對象,它把FLEX組件和 BlazeDS  server端的勾通封裝起來。channels和與之在blaze Server上對應的endpoint通信。你可以在services-config.xml 文件中配置channel的各個屬性和對應的endpoint。

如下channel 定義代碼:

 

  1.  <channels> 
  2.  
  3.    ... 
  4.  
  5.   <channel-definition id="samples-amf" 
  6.  
  7. type="mx.messaging.channels.AMFChannel"> 
  8.  
  9. <endpoint url="http://servername:8400/myapp/messagebroker/amf" type="flex.messaging.endpoints.AMFEndpoint"/> 
  10.  
  11. </channel-definition> 
  12.  
  13. </channels> 

你就創建了一個AMFChannel與服務器端的AMFEndpoint的通信channel。

 

其中endpoint URL 是endpoint暴露給外邊可以訪問的地址。channel用它和endpoint交互。這個url必須是唯一的,在所有服務器上暴露的endpoints中,這個url值指向MessageBrokerServlet。

 

怎樣給flex component分配channel

   flex components 用ChannelSet設定channel,它裏面可以包括多個channel,去和server 交互。你可以選擇自動和手動分配channel 給flex 組件。假如你在編譯你的MXML文件時,把你的compiler 配置上 -services 選 項讓它指向services-config.xml 文件,那麼你的組件(如RemoteObject, HTTPService等)就自動分配一個配置好的channel實例, 這個channel是根據你在services-config.xml 文件中定義好的包括destination。第二種情況如果你不想在你的compiler 中設置什麼-services

選項,你可以在 MXML or ActionScript中手動創建你的channel,然後把它分配給你的flex components。如果你也不想自己配置channel,Application-level 默認channels這時就會被用到。

  如下代碼自己手動定義channel

  in mxml:

  1. <RemoteObject id="ro" destination="Dest"> 
  2.  
  3. <mx:ChannelSet> 
  4.  
  5. <mx:channels> 
  6.  
  7. <mx:AMFChannel id="myAmf"     uri="http://myserver:2000/myapp/messagebroker/amf"/> 
  8.  
  9. </mx:channels> 
  10.  
  11. </mx:ChannelSet> 
  12.  
  13. </RemoteObject> 

in  ActionScript:

  1. private function run():void { 
  2.  
  3.    ro = new RemoteObject(); 
  4.  
  5. var cs:ChannelSet = new ChannelSet(); 
  6.  
  7.   cs.addChannel(new AMFChannel("myAmf", "http://servname:2000  /eqa/messagebroker/amf")); 
  8.  
  9. ro.destination = "Dest"
  10.  
  11. ro.channelSet = cs
  12.  

注意當你在客戶端分配設置了channel 並指定了channel type 和 endpoint URL,但並沒有

指定handles 請求的endpoint class。所以這時你還要在services-config.xml中定義你用的這個channel,指明它的url 用到的endpoint class。

把channel和endpoint分配給destination

 (前面不是提到在services-config.xml中配置了一系列 的<channels><channel/></channels>嗎,然後下面就可以在message-  config.xml 中引用配置好的channel進行通信了。原文是在service-config.xml中配置的,這點也可以配在message-config.xml 中)     

 我們用channel和endpoint目的就是把我們的從client傳過來的東西送到目的地destination。說到給destination分channel我們可以分 以下幾中情況。

       1,在所有services中的大多數destinations用同樣的channels。我們可能定義應用級別(application-level)默認channels在services-config.xml文件中。如

 

  1. <services-config ...> 
  2.  
  3. ... 
  4.  
  5. <default-channels> 
  6.  
  7. <channel ref="my-http"/> 
  8.  
  9. <channel ref="my-amf"/> 
  10.  
  11. </default-channels> 
  12.  
  13. ... 
  14.  
  15. </services-config > 

這樣所有沒定義channel的destinations就會用上面定義的默認channel,當然destinations和services都可以重載默認 channel,通過指明自己的channel。

      2.在一個service中的大多數destinations用同樣的channels。我們可以定義服務級別(service-level )默認channels在services-config.xml文件中。如

 

  1. <service ...> 
  2.  
  3.      ... 
  4.  
  5.   <default-channels> 
  6.  
  7.   <channel ref="my-http"/> 
  8.  
  9.   <channel ref="my-amf"/> 
  10.  
  11.  </default-channels> 
  12.  
  13. ... 
  14.  
  15. </service> 

這樣以來,在一個service中沒有指定channel的destination就會用到本服務內的默認channels.

      3.一個destination 定義自己的channel.代碼如下:

  1. <destination id="sampleVerbose"> 
  2.  
  3.   <channels> 
  4.  
  5.   <channel ref="my-secure-amf"/> 
  6.  
  7.   </channels> ... 
  8.  
  9.  </destination> 

BlazeDs 基於消息的framework

      blazeds 是利用基於消息的框架完成數據在客戶端和服務器之間來回傳遞的。實際上blazeds用二種最重要的數據交換模式。第一種就是請求響應模式。PRC就是用 的這種模式,這個我前幾天自己摸個CRUD例子出來。推銷一下:http://download.csdn.net/source/1527797(這個 例子要求你自己要寫個Uint bean,另外要把你的Flex編譯器設置-services 選項並指向services-config.xml文件)。

      第二種模式就是發佈訂閱模式。在這模式下,服務器把published的信息發送給一系列訂閱了這些信息的customer。舉例說Messaging Service就是用這種方式把data發給對data感興趣的client,當然Messaging Service也用 request-response pattern去與client玩。


轉自:

http://www.ebibi.com/i/experience/2011/0407/3736.html

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