轉貼 BlazeDS 的架構及工作原理

 

一、先來簡單的看blazeDS.

1、blazeds是一個web應用框架。無非就是servlet,jsp和filter,無他。

2、一個web應用框架的基礎還是servlet和過濾器。所以它裡面有個MessageBrokerServlet。這個servlet的用處和其他框架,如struts,spring,或者xwork裡的新增配置文件(struts.xml,application.xml)所起到的作用類似,匹配url,決定將請求發往給哪個服務。

3、blazeds的名詞解釋。

我要裝修房子,知道張三是做裝修的,有三種方式(電子郵件,電話,快遞)都可以聯繫,他可以提供多種服務,如牆漆,家具,地板,燈具。

1)channels通道,就是三種聯繫方式。

2)endpoints端點,就是三種聯繫方式的具體內容,每種聯繫方式可以有多個。如電話,他裝有三個12365444,451325648,45668,當然也可以僅有一個。我第一個打不通就打地二個,第二個打不通就打第三個。

3)serive,是張三的家務事,他可以安排電話專門負責接牆漆的單子,email接家具的單子。

4)destination目的。我們需要什麼牆漆,綠色的,紅色的等等具體的服務內容。

6)adapter適配器。這是張三的家事了,他知道誰誰嘴巴子甜,就讓他接電話,哪個喜歡在網上漫遊就讓他收發郵件。

4、張三的所有的服務在他內部是通過services-config.xml等幾個文件安排的,對外他可以發佈自己的destination,endpoints和channels到報紙,雜誌,網絡,或者其它公共信息載體,也可以僅僅發給自己的私密好友。

二、Blazeds體系結構
一個Blazeds應用包含了一個運行在瀏覽器或者Adobe AIR的客戶端應用並且和J2EE應用服務端通信。客戶端可以是Flex也可以是結合Flex、HTML/JavaScript的應用程序。

整個體系主要包括通道、端點、消息、服務、目的地、適配器等,把這些搞懂也就差不多了。通道使得組件能夠和Blazeds服務端的端點通信,將請求送到目的地端點和通道是相互映射的
1.Blazeds客戶端體系結構
       Blazeds使用一個基於消息的框架與服務端結合。這個框架使用通道封裝了Flex程序和Blazeds服務端之間的連接。下面是Blazeds客戶端的結構

以下Flex組件和Blazeds服務端結合:
       . RemoteObject
       • HTTPService
       • WebService
       • Producer
       • Consumer
所有的這些組件都包含在Flex SDK和rpc.swc組件庫中。
儘管RemoteObject、Producer、Consumer包含在Flex SDK中,他們仍然需要一個服務端來反編譯出他們發送的消息。Blazeds和LiveCycle Data Services ES服務就是兩個這樣的服務端。當然Flex應用程序可以不使用Blazeds這種中間層而是直接使用HTTP Service或者Web Service來調用遠程服務
2.0 通道和通道設置
        Flex組件使用通道和Blazeds服務端交互。一條通道包含多條道路,他們的基礎功能就是提供Flex客戶端和Blazeds服務端的交流。通道中的道路都是按性能排序的。Flex組件會嘗試連接第一條道路,不過這並不能保證一定能連接,有可能使用的還是道路中後面的那幾條。它會搜尋通道中的道路知道連接上或者已經沒有連接。

通道封裝了Flex組件和Blazeds服務端之間的連接方式。概念上來說,通道是Flex組件下面的組件,他們處理組件和Blazeds服務端之間的交互。他們和Blazeds服務端上相應的端點通信。

        Flex客戶端使用不同的通道類型。例如AMFChannel和HTTPChannel。通道選擇有很多的因素,包括你的程序構建的類型。如果你想要使用無二進制壓縮的方式傳輸,可以使用HTTPChannel,它使用AMFX(AMF in XML),一種無二進制壓縮的方式。

下面的例子在services-config.xml文件中創建了一個AMFChannel通道,與服務器上的AMFEndpoint通信:

<channels>

<channel-definition id="samples-amf" class="mx.messaging.channels.AMFChannel">

<endpoint url="http:// servername:8400/myapp/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>

</channel-definition>

</channels>

2.1為flex組件指定通道

如果你通過-services選項指定services-config.xml文件來編譯MXML文件,那麼組件(RemoteObject、HTTPService等等)會自動指定一個或者多個通道配置實例。

不過如果你沒有加這個編譯參數,或者想自己覆寫編譯項的行為,那麼你可以在MXML或者AS文件中為組件指定通道。當你想要為你的組件使用動態目的地的時候,整個應用級別的默認通道非常重要。

通過加上-services編譯參數,可以包含所有的客戶端連接服務器需要的信息,但是一下情況你可能會選擇手動設置通道:

1) 你不想硬編碼端點路徑在你編譯的客戶端swf文件。

2) 你想要動態的創建目的地(目的地不在services-config.xml文件內)。

3) 你想要在客戶端代碼控制組件使用通道的順序。

下面的代碼展示了如何在MXML文件中定義通道:

<RemoteObject id="ro" destination="Dest">

<mx:channelSet>

<mx:ChannelSet>

<mx:channels>

<mx:AMFChannel id="myAmf"

道MLcationonfig.xmluri="http://myserver:2000/myapp/messagebroker/amf"/>

</mx:channels>

</mx:ChannelSet>

</mx:channelSet>

</RemoteObject>

下面的代碼則是AS文件:

private function run():void {

ro = new RemoteObject();

var cs:ChannelSet = new ChannelSet();

cs.addChannel(new AMFChannel("myAmf",

"http://servname:2000/eqa/messagebroker/amf"));

ro.destination = "Dest";

ro.channelSet = cs;

}

注意:當你在客戶端代碼創建通道時,還是必須在services-config.xml文件裡配置一個指定端點的通道。否則,messagebroker就不能傳遞客戶端請求到端點。

2.2 為目的地指定通道和端點

如果大多數的目的地使用使用相同的通道,你可以指定應用級別的默認通道,比如:

<services-config ...>

...

<default-channels>

<channel ref="my-http"/>

<channel ref="my-amf"/>s

</default-channels>

...

也可以單獨指定通道,比如:

<destination id="sampleVerbose">

<channels>

<channel ref="my-secure-amf"/>

</channels>

...

</destination>

2.3 選擇端點

       可以參考文檔或者看blazeds通道、端點配置

消息

Flex客戶端組件和Blazeds服務端都是基於消息進行交流的,Flex組件使用幾種消息和他們對應的服務交流。所有的消息有基於客戶端的(ActionScript)和基於服務端(Java)的,因為這些消息分別在客戶端和服務端序列化和反序列化。
一些消息,比如應答消息和命令消息,使用不同的Flex組件和Blazeds服務。其他的消息類型使用特殊的Flex組件和Blazeds服務。例如消息生產者發送消息給消息消費者組件。
其他情況下,你不可以直接寫代碼構造和發送消息。例如,你只是使用遠程組件(RemoteObject)調用遠程方法遠。遠程組件創建一個遠程消息封裝給遠程對象調用。返回的消息封裝在一個ResultEvent中。
Blazeds服務端體系

         Blazeds

服務就是一個包含J2EE Web應用程序的應用。Flex客戶端通過通道發送請求到Blazeds服務的端點上。從端點開始,請求經過一些列的Java對象包括消息傳播對象、服務對象、目標對象以及最終的適配器對象。適配器將請求實現為本地的、或者contacting a backend system或者遠程服務例如JMS服務。下面展示了Blazeds服務體系

端點

基於服務的端點是通過MessageBrokerServlet啟動的,需要在web.xml中配置的。除此之外,HTTP session監聽器也要加入到web程序的web.xml中。

<servlet>

<servlet-name>MessageBrokerServlet</servlet-name>

<display-name>MessageBrokerServlet</display-name>

<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>

<init-param>

<param-name>services.configuration.file</param-name>

<param-value>/WEB-INF/flex/services-config.xml</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

客戶端程序使用通道和Blazeds端點通信。端點和通道是相互映射的,保持端點和通道使用相同的消息格式是很重要的。如果通道使用AMF消息格式,比如AMFChannel,端點也必須AMF消息格式與之匹配,比如AMFEndpoint。

你可以在WEB-INF/flex目錄下的services-config.xml配置端點。
MessageBroker
         MessageBroker是為了將消息路由給服務端,是Blazeds在服務端的核心。在端點經過初步的處理請求並且將提煉出來的消息傳遞給MessageBroker。MessageBroker查看消息的目的地,然後將他傳遞過去。如果目的地有安全現在,他就在傳遞之前運行檢查證明。
服務和目的地
服務和目的地是消息在Blazeds服務中傳遞處理的下一站。系統包括4個服務以及他們對應的目的地:
        RemotingService(遠程服務) 和 RemotingDestination(遠程目的地)

        HTPProxyService(HTTP

代理服務) and HTTPProxyDestination(HTTP代理目的地)
        MessageService(消息服務) and MessageDestination(消息目的地)
服務是消息傳遞過來的目標,可以將目的地想像成服務的實例。例如,遠程組件和遠程服務通信中,你必須指定一個遠程目標,例如你要調用的類的方法。這種客戶端和服務端的映射是按照下面來實現的:
        HTTPService 和 WebService HTTPProxyService/HTTPProxyDestination通信
        RemoteObject和 RemotingService/RemotingDestination通信
        Producer、Consumer和 MessageService/MessageDestination通信
你可以在sevices-confi.xml中配置服務和目的地,但是最好是將他們放進不同的文件:
                RemotingService配置在remoting-confi.xml
                HTTPProxyService配置在proxy-config.xml
                MessageService配置在messaging-config.xml

適配器和」隨機」的編譯是消息處理鏈中的最後一環。當一個消息抵達正確的目的地以後,它就會被傳遞給適配器被實現成本地的或者後台系統或者一個遠程服務(JMS)。Blazeds使用如下的方式在適配器和目的地間映射
        RemotingDestination uses JavaAdapter
        HTTPProxyDestination uses HTTPProxyAdapter or SOAPAdapter
        MessageDestination uses ActionScriptAdapter or JMSAdapter

留言

這個網誌中的熱門文章

WPF - 深入 Style

C# – M$ Chart Control 自定 ToolTip 的顯示

Vue.js - 基礎介紹教學