張 威
(湖北工業(yè)大學(xué)計(jì)算機(jī)學(xué)院, 湖北 武漢 430068)
?
基于Xfire實(shí)現(xiàn)跨平臺(tái)的Flex消息訂閱服務(wù)
張 威
(湖北工業(yè)大學(xué)計(jì)算機(jī)學(xué)院, 湖北 武漢 430068)
通過(guò)分析當(dāng)前RIA中流行的解決方案----Flex,針對(duì)Flex的異步通信機(jī)制,結(jié)合Xfire提供一個(gè)跨平臺(tái)的消息訂閱服務(wù),利用了BlazeDS作為中間件,可以實(shí)現(xiàn)消息的廣播傳輸,很好地應(yīng)對(duì)互聯(lián)網(wǎng)中跨平臺(tái)的各種主動(dòng)消息推送。
Xfire;Flex;BlazeDS;消息訂閱服務(wù);RIA
互聯(lián)網(wǎng)應(yīng)用中,經(jīng)常會(huì)有消息的主動(dòng)推送服務(wù),諸如進(jìn)入一個(gè)網(wǎng)站,就會(huì)有各種各樣的推廣來(lái)提供給用戶(hù)。當(dāng)用戶(hù)瀏覽某一個(gè)商品后,服務(wù)器就會(huì)根據(jù)用戶(hù)的習(xí)慣行為與瀏覽記錄來(lái)為用戶(hù)定制專(zhuān)門(mén)的商品信息服務(wù),主動(dòng)推送各種消息。各種門(mén)戶(hù)網(wǎng)站用戶(hù)也可以訂閱自己感興趣的內(nèi)容,一旦訂閱,服務(wù)器就會(huì)主動(dòng)推送最新的內(nèi)容給用戶(hù)。利用Flex來(lái)構(gòu)建Web應(yīng)用,同樣也需要這種消息訂閱服務(wù),考慮到平臺(tái)異構(gòu)性與交互性,需要引入一個(gè)Web Service來(lái)作為外部訪問(wèn)的接口。
由于移動(dòng)終端的迅猛發(fā)展,要部署一個(gè)Web應(yīng)用就必須要考慮到跨平臺(tái)移植性,而Flex則利用Adobe Player的廣泛裝機(jī)量,真正實(shí)現(xiàn)了跨平臺(tái)。為實(shí)現(xiàn)各種客戶(hù)端能夠訪問(wèn)服務(wù)器端,屏蔽各種編程語(yǔ)言的差異,需要提供一個(gè)跨平臺(tái)的服務(wù)調(diào)用機(jī)制,Web Service就是一種這樣的技術(shù),Xfire是一種非常優(yōu)秀的Web Service框架,構(gòu)建快速、穩(wěn)定。
1.1 Xfire
Xfire是一代新的Web Service引擎。Xfire是codehaus推出的在設(shè)計(jì)上面向文檔的Java SOAP框架, 通過(guò)提供簡(jiǎn)單的API和支持標(biāo)準(zhǔn)協(xié)議, 可以方便地開(kāi)發(fā)面向服務(wù)的應(yīng)用程序,內(nèi)建在STAX基于流的XML解析引擎的基礎(chǔ)上, Xfire擁有能夠脫離Web服務(wù)器的單元測(cè)試能力,能夠支持普通的Java對(duì)象、面向XML綁定的Java架構(gòu),并且是利用XML流式STAX來(lái)處理XML文檔,支持通用的傳輸協(xié)議,如HTTP、JMS等,另外還有個(gè)強(qiáng)大豐富的API庫(kù)。
Xfire的高性能主要得益于Xfire使用的內(nèi)存非常小,且提供了幾種性能優(yōu)化的方法,諸如Java虛擬機(jī)內(nèi)部傳輸。但是Xfire同樣也有些局限性,Xfire在開(kāi)發(fā)WSDL模塊工具的時(shí)候,經(jīng)常要使用到注解,這點(diǎn)非常不方便,支持的附件很少,并且沒(méi)有簡(jiǎn)單易用的開(kāi)發(fā)文檔[1]。
1.2 Flex
Flex是當(dāng)前應(yīng)用最廣最成熟的RIA 技術(shù)之一,它非常適合去構(gòu)建一個(gè)良好網(wǎng)絡(luò)交互能力和絢麗表現(xiàn)效果的Web應(yīng)用。Flex主要是作為客戶(hù)端,通過(guò)異步方式和服務(wù)器通信,將獲取的數(shù)據(jù)通過(guò)組件展現(xiàn)給用戶(hù)[2]。在Flex應(yīng)用程序框架中, Flex表示服務(wù)器提供基于標(biāo)準(zhǔn)的、聲明的編程方法和流程,并提供運(yùn)行時(shí)服務(wù),用于開(kāi)發(fā)和部署客戶(hù)端應(yīng)用程序的表示層。 Flex具有非常便利的頁(yè)面展示特性,諸如內(nèi)置的字段校驗(yàn)、過(guò)濾器、視頻播放器、數(shù)據(jù)格式以及特效等,而這些正是Flex與傳統(tǒng)HTML應(yīng)用程序的差異[3]。
Flex的客戶(hù)端應(yīng)用程序框架由MXML、ActionScript及Flex類(lèi)庫(kù)構(gòu)成。用戶(hù)直接在MXML文件中利用內(nèi)置組件以及ActionScript編寫(xiě)Flex應(yīng)用程序, Flex提供了強(qiáng)大的通用組件,可以直接調(diào)用,諸如表格、曲線圖、柱形圖、菜單、折疊面板等各種頁(yè)面布局組件, 再用ActionScript 定義客戶(hù)邏輯與程序控制。也包含了Web服務(wù)連接、用戶(hù)界面組件與數(shù)據(jù)源之間的數(shù)據(jù)綁定、動(dòng)畫(huà)效果等不可視組件。MXML專(zhuān)注于表示層的邏輯,將表示層與業(yè)務(wù)邏輯分開(kāi),提高了應(yīng)用程序的復(fù)用性。Flex可以很方便地利用各種中間件來(lái)實(shí)現(xiàn)與服務(wù)器端Java的通信,諸如BlazeDS、LCDS。
1.3 BlazeDS
Flex與服務(wù)器通信可以用HTTPService、WebService、URLLoader來(lái)完成,但數(shù)據(jù)流傳輸較小,當(dāng)需要Flex與后臺(tái)服務(wù)器之間傳輸大量的數(shù)據(jù)或者不同對(duì)象的序列化時(shí)候,則利用實(shí)現(xiàn)了AMF協(xié)議的BlazeDS。BlazeDS可以用來(lái)與服務(wù)器端的Java對(duì)象遠(yuǎn)程交互,也可以在客戶(hù)端之間傳遞消息。一般可以利用BlazeDS的遠(yuǎn)程技術(shù)來(lái)調(diào)用POJO或者EJB方法,可以利用其消息系統(tǒng)從客戶(hù)端向服務(wù)器端發(fā)送消息,并且由服務(wù)器端向客戶(hù)端推送消息[4]。
BlazeDS為客戶(hù)端與服務(wù)器之間通信提供了一系列的服務(wù),實(shí)現(xiàn)了它們之間的實(shí)時(shí)消息傳遞,可以利用這一點(diǎn)來(lái)實(shí)現(xiàn)服務(wù)器端的消息主動(dòng)推送服務(wù)。BlazeDS核心功能就是RPC Service和Messaging Service。遠(yuǎn)程過(guò)程調(diào)用服務(wù)為Flex前臺(tái)訪問(wèn)服務(wù)器端的J2EE提供了一種異步請(qǐng)求機(jī)制,服務(wù)器端處理請(qǐng)求后返回?cái)?shù)據(jù)到客戶(hù)端。消息服務(wù)可以使得客戶(hù)端程序通過(guò)往返的消息和服務(wù)端異步通訊。
2.1 服務(wù)流程圖
整個(gè)服務(wù)設(shè)計(jì)理念是為了實(shí)現(xiàn)跨平臺(tái)的消息服務(wù),使得分布于各個(gè)地方的異構(gòu)化平臺(tái)都能最終發(fā)送與接收消息服務(wù)。Flex本來(lái)就是跨平臺(tái)的,不論是Windows平臺(tái)下還是Linux平臺(tái)下,都可以正常訪問(wèn),這也得益于Flash Player的廣泛裝機(jī)量,并且在移動(dòng)終端領(lǐng)域中的市場(chǎng)份額,Android手機(jī)上依然可以訪問(wèn)Flex平臺(tái),內(nèi)置于Web中,可以輕松的隨時(shí)隨地訪問(wèn)。Flex和服務(wù)器端的Java程序用BlazeDS通信即可。
為了融合異構(gòu)平臺(tái)的交互與通信,實(shí)現(xiàn)軟件開(kāi)發(fā)環(huán)境下的跨平臺(tái),需要使用Web Service服務(wù),這里就用到Xfire作為Web Service的實(shí)現(xiàn),圖1為服務(wù)流程圖。

圖1 服務(wù)流程圖
2.2 Flex前端實(shí)現(xiàn)
在J2EE項(xiàng)目中,整合Flex作為其表示層,只需要利用開(kāi)發(fā)工具M(jìn)yEclipse,構(gòu)建一個(gè)Web Project,然后再右鍵點(diǎn)擊“添加/更改項(xiàng)目類(lèi)型”為Flex項(xiàng)目類(lèi)型。項(xiàng)目創(chuàng)建好后,將BlazeDS下的WEB-INF和META-INF文件夾內(nèi)容復(fù)制到創(chuàng)建的Flex項(xiàng)目下的WebRoot目錄中,至此開(kāi)發(fā)環(huán)境構(gòu)建好。
這里采用BlazeDS作為Flex訪問(wèn)后臺(tái)Java程序的中間件。消息主動(dòng)推送利用BlazeDS的消息服務(wù)功能實(shí)現(xiàn)。Flex內(nèi)置有Producer和Consumer兩個(gè)ActionScript類(lèi),這兩個(gè)類(lèi)是內(nèi)置的消息機(jī)制類(lèi),也是設(shè)計(jì)模式中使用到的一種“生產(chǎn)者和消費(fèi)者模式”。
BlazeDS的核心功能是消息服務(wù),一個(gè)消息屬性有一個(gè)唯一消息ID、多個(gè)BlazeDS 消息頭、多個(gè)自定義的消息頭和消息正文。客戶(hù)端程序調(diào)用消息生產(chǎn)者發(fā)送消息,可以在Flex 程序中使用生產(chǎn)者組件定義一個(gè)生產(chǎn)者。客戶(hù)端程序調(diào)用消息消費(fèi)者接受消息,可以在Flex 程序中使用消費(fèi)者組件定義一個(gè)消費(fèi)者。消費(fèi)者組件訂閱服務(wù)端地址,接收消息生產(chǎn)者發(fā)送到該地址的消息,這里主要用到的就是消息消費(fèi)者組件,而消息生產(chǎn)者由Java后臺(tái)的Servlet來(lái)實(shí)現(xiàn)。BlazeDS的消息服務(wù)中,消息的發(fā)送與接收都必須要經(jīng)過(guò)一個(gè)通道封裝,這個(gè)通道包含了服務(wù)目的地址、內(nèi)容以及網(wǎng)絡(luò)協(xié)議,并且負(fù)責(zé)消息的格式化,最后將其傳送到一個(gè)端點(diǎn)上,所以發(fā)送消息與訂閱消息必須要指定具體的通道以及端點(diǎn)目的地。
在WebRoot/WEB-INF/flex/messaging-config.xml中,添加消息發(fā)送的通道名以及端點(diǎn)。
Flex的MXML文件中,在組件的creationComplete方法中定義初始化消息消費(fèi)者,這樣就能保證每次組件初始化后,就會(huì)主動(dòng)得到消息。
var consumer:Consumer = new Consumer();
consumer.destination ="node-data-feed";
consumer.subtopic = "node";
consumer.channelSet = new ChannelSet(["my-streaming-amf"]);
consumer.addEventListener(MessageEvent.MESSAGE, messageHandler);
consumer.subscribe();
利用Consumer組件來(lái)設(shè)置通道名以及端點(diǎn)地址,監(jiān)聽(tīng)事件為MessageEvent.MESSAGE,最后利用subscribe()來(lái)訂閱消息,所有發(fā)送到這個(gè)端點(diǎn)的消息都會(huì)主動(dòng)反饋給該組件,可以在該監(jiān)聽(tīng)方法messageHandler進(jìn)行消息的獲取。
2.3 服務(wù)器Servlet端實(shí)現(xiàn)
利用Servlet來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯,Web Service中的接口就能夠通過(guò)HTTP方式來(lái)訪問(wèn)。在Servlet只需要設(shè)置解析Web Service以HTTP協(xié)議傳遞過(guò)來(lái)的各種參數(shù)具體值。這里用到了MessageBroker 和AsyncMessage ,兩者都是Flex與Java消息通信的Java語(yǔ)言具體實(shí)現(xiàn)類(lèi)。MessageBroker 負(fù)責(zé)消息發(fā)送,而AsyncMessage 包含了消息端點(diǎn)、消息頭、消息正文、客戶(hù)端ID、消息ID等信息。
MessageBroker msgBroker = MessageBroker.getMessageBroker(null);
String clientID = UUIDUtils.createUUID();
String mess = "&";
AsyncMessage msg = new AsyncMessage();
msg.setDestination("node-data-feed");
msg.setHeader("DSSubtopic", "node");
msg.setClientId(clientID);
msg.setMessageId(UUIDUtils.createUUID());
msg.setTimestamp(System.currentTimeMillis());
msg.setBody(mess);
msgBroker.routeMessageToService(msg, null);
2.4 Xfire的Web Service實(shí)現(xiàn)
在MyEclipse中直接創(chuàng)建一個(gè)Xfire的Web Service項(xiàng)目,會(huì)自動(dòng)生成服務(wù)名,以及服務(wù)接口和服務(wù)實(shí)現(xiàn)類(lèi),此服務(wù)名就是外部訪問(wèn)該服務(wù)接口時(shí)候的名稱(chēng)。在項(xiàng)目根目錄下會(huì)自動(dòng)生成一個(gè)WebServices文件夾,該文件夾中的services.xml主要就是服務(wù)的各種描述,具體代碼如下:
在提供給外部調(diào)用的方法中,添加訪問(wèn)Servlet的方法,這里利用URL類(lèi),直接通過(guò)HTTP協(xié)議來(lái)與服務(wù)器端的Servlet通信,代碼如下:
String path = "http://" + Servlet主機(jī)IP+ ":" + Servlet主機(jī)Web服務(wù)器端口號(hào)+ "/"+Servlet名+"/" +其余參數(shù)
URL messUrl = new URL(path);
messUrl.openStream();
2.5 消息訂閱服務(wù)總結(jié)
本系統(tǒng)利用Xfire來(lái)實(shí)現(xiàn)異構(gòu)化平臺(tái)之間的通信,當(dāng)外部訪問(wèn)Xfire提供的各種接口后,最終都會(huì)直接調(diào)用服務(wù)器端的Servlet,而Servlet會(huì)將這些消息傳遞給指定的通道與端點(diǎn)所確定的位置,當(dāng)用戶(hù)打開(kāi)頁(yè)面,F(xiàn)lex組件初始化完畢后,就會(huì)主動(dòng)在已設(shè)定好的通道與端點(diǎn)中拉送消息,當(dāng)有消息后,這些消息會(huì)發(fā)送給那些已經(jīng)訂閱消息的組件,整個(gè)消息訂閱就完成了。
本文通過(guò)Web Service中的Xfire技術(shù)和Flex進(jìn)行分析與闡述,介紹了各個(gè)技術(shù)的特點(diǎn)以及應(yīng)用場(chǎng)合,并且分析了Flex與Java后臺(tái)通信的中間件BlazeDS。通過(guò)對(duì)幾個(gè)技術(shù)的闡明與分析,最終實(shí)現(xiàn)了一個(gè)基于Xfire下的Flex消息訂閱服務(wù),可以很好地實(shí)現(xiàn)異構(gòu)化平臺(tái)之間的交互。手機(jī)終端、PC終端都可以訪問(wèn)Web Service接口,在服務(wù)中實(shí)現(xiàn)了跨平臺(tái),在Web頁(yè)面中也實(shí)現(xiàn)了跨平臺(tái)。構(gòu)建高可靠性、穩(wěn)定性、靈活性的Web服務(wù),需要在基本功能實(shí)現(xiàn)的基礎(chǔ)上,進(jìn)一步地研究與實(shí)現(xiàn)。
[1] 劉 通,張亞男. 基于Xfire的分布式Java Web Services的應(yīng)用[J].長(zhǎng)春工業(yè)大學(xué)學(xué)報(bào),2008,29(02):183-185.
[2] 吳 波.Flex異步通信方式的比較[J].廣播與電視技術(shù),2012(02):133-138.
[3] 王 非. WebServices應(yīng)用研究與RIA系統(tǒng)中的實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2010,27(03): 168-170.
[4] 蝦 皮.細(xì)細(xì)品味Flex-BlazeDS開(kāi)發(fā)指南[EB/OL]. (2012-05-26)[2014-09-01]http://www.cnblogs.com/xia520pi/archive/2012/05/26/2519343.html.
[責(zé)任編校: 張巖芳]
The Cross-platform Flex News Subscription Service Based on Xfire
ZHANG Wei
(SchoolofComputerScience,HubeiUniv.ofTech. ,430068Wuhan,China)
The paper analysed the asynchronous mechanism of Flex-the widely used solution in RIA, this paper provided a cross-platform news subscription service which is integrated with Xfire and utilizes BlazeDS. The service can implement the news broadcast transmission, and push the cross-platform news on the Internet very well. Keywords: Xfire;Flex;BlazeDS; news subscription service; RIA
2014-10-21
張 威(1988-), 男, 河南息縣人,湖北工業(yè)大學(xué)碩士研究生,研究方向?yàn)橛?jì)算機(jī)網(wǎng)絡(luò)
1003-4684(2015)01-0039-04
TP3
A