楊 力,陳利學,趙永清,廖浩德
(1.西南石油大學計算機科學學院,成都 610500;2.四川大學計算機學院,成都 610065)
隨著Internet復雜程度的不斷提高和新型網(wǎng)絡(luò)分布式應(yīng)用的出現(xiàn),基于 DCOM/CORBA/EJB的傳統(tǒng)C/S分布式計算模型日益暴露出其缺點,已遠不能滿足當今快速多變的網(wǎng)絡(luò)應(yīng)用需求。移動Agent技術(shù)集智能Agent、分布式計算、通信于一體,提供了強大、統(tǒng)一、開放的計算模式,適合提供復雜的業(yè)務(wù)邏輯,并能夠遷移到遠程主機執(zhí)行,大幅降低了網(wǎng)絡(luò)帶寬,能有效克服網(wǎng)絡(luò)不穩(wěn)定、負載性能和效能等問題。
但是目前大多數(shù)應(yīng)用都是基于Web的應(yīng)用開發(fā),由于 Web應(yīng)用的大型化、功能日益復雜,傳統(tǒng) Web頁面與業(yè)務(wù)邏輯混合開發(fā)的開發(fā)模式已不能適應(yīng)快速開發(fā)的需要,急需一種既能實現(xiàn)企業(yè) Web開發(fā)、縮短開發(fā)周期、節(jié)省開發(fā)成本,又易于修改、維護和擴展的開發(fā)框架。
本文通過研究移動 Agent理論和 Web開發(fā)框架關(guān)鍵技術(shù),分析Agent與MVC模式的結(jié)合優(yōu)勢,提出基于移動代理的Aglet-Struts Web應(yīng)用集成框架,使Aglet在 Struts控制器 action統(tǒng)一調(diào)度下,完成 JSP、action和Aglet的交互,實現(xiàn)了顯示和邏輯的完全分離[1]。
Aglet是最早基于Java的移動Agent開發(fā)平臺之一,Aglet的名字來源于 Agent和 Applet,可以簡單地將其看成具有Agent行為的Applet對象。由于Aglet本身具有的主動性、能動性、社交能力、反應(yīng)能力,與傳統(tǒng)C/S模式、移動代碼技術(shù)、DCOM等技術(shù)相比,Aglet集中了它們的優(yōu)點。
Aglet使得程序的執(zhí)行盡可能地靠近數(shù)據(jù)源,降低網(wǎng)絡(luò)的通信開銷,平均負載,提高完成任務(wù)的時效,在各Aglet間交互方面表現(xiàn)出了強大的優(yōu)勢和靈活性[2]。
由于 Web應(yīng)用的逐漸普及,利用基于 MVC的Struts 2框架已經(jīng)成為構(gòu)建靈活、高效、易于部署、跨平臺的分布式應(yīng)用程序的主流技術(shù)。Struts框架成功實現(xiàn)服務(wù)端的模塊化,將 Web應(yīng)用劃分為控制器(action)、模型(javaBean)、視圖(JSP)。
各組件間實現(xiàn)了松耦合,為大型項目開發(fā)提供優(yōu)勢,主要體現(xiàn)在:(1)組件化便于在開發(fā)中劃分職責,有利于代碼重用;(2)可以通過控制器action控制系統(tǒng)全局流程;(3)模塊化,通過 javaBean實現(xiàn)新業(yè)務(wù),無需修改整個應(yīng)用,便于后期維護和業(yè)務(wù)擴展[3-4]。
Aglet間的交互比較容易,Aglet與 Web的交互卻很困難,這樣在Web應(yīng)用中就不能充分體現(xiàn)Aglet的優(yōu)勢。但是把Aglet看作是Struts框架中的模型,即業(yè)務(wù)邏輯,通過Struts 框架把Aglet、控制器(action)和 JSP頁面三者有機結(jié)合,實現(xiàn) Web前端與 Aglet的互操作。這樣就可以充分體現(xiàn)Aglet和Struts框架的優(yōu)勢,為構(gòu)建更加靈活、高效、異構(gòu)的 Web應(yīng)用框架提供新的手段,具有重要的意義。
如圖1所示,把Aglet引入到Struts 2框架中,將應(yīng)用程序分成 3個核心部件:模型(Aglet、Javabean),視圖(JSP),控制器(Action、AgletAction),實現(xiàn) Struts 2與Aglet的整合[5]。
圖1 基于MVC的Aglet-Struts 2框架結(jié)構(gòu)
該整合框架模型由6個層組成,分別是表示層、控制層、業(yè)務(wù)層、持久層、MA服務(wù)層和Aglet子系統(tǒng)層。這種框架使用軟件分層的思想,將軟件的表示層、控制層和邏輯層分開,各層完成自己的功能,避免了以前的軟件開發(fā)中各部分的功能集中在一起所帶來的維護和修改困難問題。
(1)表示層即MVC模式中的視圖部分,此層主要由一組JSP文件組成,完成用戶界面展示,用戶通過瀏覽器訪問系統(tǒng)界面實現(xiàn)與服務(wù)器端控制器交互。該層不應(yīng)該存在模型信息,只有標簽,這些標簽可以是標準的JSP標簽,也可以是用戶自定義的標簽[6-7]。
(2)控制層即MVC模式中的控制部分,此層繼承action類,扮演中央控制器的角色。利用 struts.xml配置信息,根據(jù)action名字與類名的映射關(guān)系,調(diào)用適當?shù)腶ction對象實現(xiàn)對模型的控制。action類負責調(diào)用模型的方法,更新模型的數(shù)據(jù)狀態(tài),并控制一個具體的應(yīng)用流程,它本身也可以完成一些實際的業(yè)務(wù)邏輯[8]。
action控制器充當用戶請求和業(yè)務(wù)邏輯處理之間的適配器,將請求與業(yè)務(wù)邏輯分開。它側(cè)重于控制應(yīng)用程序的流程,應(yīng)用程序的邏輯放在單獨的 Java文件中,這樣可以提高應(yīng)用程序的靈活性和可重用性。
在Aglet-Struts 2框架中有一個特殊的action,即AgletAction,它用來控制移動Aglet子系統(tǒng)中的業(yè)務(wù)流程,移動 Aglet子系統(tǒng)中主要由一個或多個AgletServer組件和Context內(nèi)創(chuàng)建的Aglet組件組成,它們之間的關(guān)系如圖2所示。
圖2 AgletAction與AgletServer的關(guān)系
(3)業(yè)務(wù)層即 MVC模型部分。主要以 JavaBean或 Aglet形式存在,主要處理表現(xiàn)層的請求并利用DAO(封裝了對底層數(shù)據(jù)庫的操作)組件進行持久層操作、Remoting與 MA服務(wù)層交互并將所得信息在業(yè)務(wù)層進行匯總并以 JSP頁面的形式將信息反饋給用戶[9]。
(4)持久層主要利用持久層框架如Hibernate進行底層數(shù)據(jù)庫的持久操作,從而實現(xiàn)對數(shù)據(jù)庫訪問的透明化處理。數(shù)據(jù)庫的連接管理、事務(wù)處理由框架的容器處理,從而提高數(shù)據(jù)存儲與訪問效率。
(5)MA服務(wù)層通過一個 Java類,實現(xiàn)自定義的AgletServer,該 Server具有創(chuàng)建 Aglet并為 Aglet的運行提供Aglet上下文環(huán)境(Aglet Context)和Aglet間通信的代理機制。創(chuàng)建好的Aglet能夠被派遣到子系統(tǒng)執(zhí)行相應(yīng)的任務(wù)。同時利用 Remoting將此層導出為RMI服務(wù)供業(yè)務(wù)層調(diào)用,從而實現(xiàn)業(yè)務(wù)層與Aglet子系統(tǒng)的整合。
(6)Aglet子系統(tǒng)層直接由Aglet系統(tǒng)提供的Tahiti服務(wù)器作為MA的運行環(huán)境,接收從MA服務(wù)層派遣過來的 Aglet,并由此 Aglet執(zhí)行相應(yīng)的業(yè)務(wù)處理任務(wù)。MA服務(wù)層和子系統(tǒng)管理層,子系統(tǒng)管理層和子系統(tǒng)管理層間采用ATP(Aglet Transfer Protocol代理傳輸協(xié)議)進行通信,信息的傳遞通過獲取Aglet代理(AgletProxy)來實現(xiàn)。
用戶(User)通過瀏覽器(Browser)訪問中心Web服務(wù)器,并提出HTTP請求。
HTTP請求被運行在 Web服務(wù)器上的 Struts PrepareAndExecuteFilter(實際是一個 Servelet,被定義在 Web.xml文件中)所攔截,并轉(zhuǎn)交給相應(yīng)的控制器(action)處理。
控制器分為頁面跳轉(zhuǎn)控制器、用戶控制器、業(yè)務(wù)邏輯控制器,并定義在 struts.xml文件中。頁面跳轉(zhuǎn)主要用于實現(xiàn)頁面間的跳轉(zhuǎn)。用戶登錄控制用于驗證用戶的操作權(quán)限。業(yè)務(wù)邏輯處理控制用于處理各個模塊之間的業(yè)務(wù)。當控制器處理完轉(zhuǎn)交給它的請求時,通過result屬性返回一個攜帶數(shù)據(jù)的視圖,并通過視圖解析器(View Resolver)解析JSP為HTML頁面并呈現(xiàn)給用戶。控制器通過數(shù)據(jù)訪問對象(DAO)與持久層框架交互實現(xiàn)底層分布式數(shù)據(jù)庫訪問。通過 RMI對MA服務(wù)(MA Server)的訪問,實現(xiàn)控制器與MA的交互,從而實現(xiàn)Web應(yīng)用與MA交互的整合。
MA服務(wù)層(MA Server)處理從控制器傳來的請求,生成相應(yīng)的Aglet并派遣到MA子管理系統(tǒng)上執(zhí)行任務(wù)。比如生成靜態(tài)Aglet并派遣到子管理系統(tǒng)上,此靜態(tài)Aglet常駐在子管理系統(tǒng)上,并根據(jù)MA服務(wù)層所初始的 IP地址表,對派遣到的各子管理系統(tǒng)進行監(jiān)控。在執(zhí)行網(wǎng)絡(luò)任務(wù)時,靜態(tài)Aglet會對所收集的數(shù)據(jù)進行處理和過濾,并調(diào)用DAO與持久層交互并將實時數(shù)據(jù)存入分布式數(shù)據(jù)庫中。
當中心 Web服務(wù)器要獲取各個子管理系統(tǒng)所管理的數(shù)據(jù)時,可以利用 MA服務(wù)層生成一個消息Aglet,此消息 Aglet攜帶各個子管理系統(tǒng)的 IP表,根據(jù)這個IP表,此消息Aglet就可以在各個子管理系統(tǒng)間遷移。當消息Aglet到達子管理系統(tǒng)時,它與常駐其上的靜態(tài)Aglet通信,獲得所管理的數(shù)據(jù)并遷移到下一個子管理系統(tǒng),直到遍歷完所有的子管理系統(tǒng)后返回 MA服務(wù)層。MA服務(wù)層接收返回的消息Aglet,提取其中的數(shù)據(jù),返回給相應(yīng)的控制器處理??刂破髟俜祷叵鄳?yīng)的視圖JSP,并調(diào)用視圖解析器解析JSP頁面并呈現(xiàn)給用戶,供用戶查詢和分析[10-11]。
由于氣田的廣泛分布性,氣田各井站離管理中心一般相距較遠,形成了以作業(yè)區(qū)、氣礦(營銷部)、分公司3級管理體系。井站數(shù)據(jù)通過語音電話、手持移動設(shè)備或自動化采集等方式經(jīng)由無線網(wǎng)絡(luò)實時進入作業(yè)區(qū)數(shù)據(jù)庫。作業(yè)區(qū)數(shù)據(jù)庫存儲詳細的基礎(chǔ)數(shù)據(jù)。氣礦(營銷部)數(shù)據(jù)庫存儲本單位管轄區(qū)一定綜合數(shù)據(jù),同時在作業(yè)區(qū)和氣礦級實施遠程 Web監(jiān)控。分公司數(shù)據(jù)庫存儲本公司管轄的各礦區(qū)(營銷部)的綜合數(shù)據(jù)。作業(yè)區(qū)與氣礦(營銷部)之間網(wǎng)絡(luò)連接形式多樣,速率不等,導致其穩(wěn)定性較低,而客戶服務(wù)器模式要求實時在線,在數(shù)據(jù)量大的情況下,可靠性較差?;谝苿哟淼腟truts 2 MVC分布式集成框架,能有效解決系統(tǒng)運行的穩(wěn)定性和 Web瀏覽的及時性的矛盾,特別適合氣田遠程監(jiān)控分布式計算的需要。
遠程監(jiān)控移動代理平臺負責與作業(yè)區(qū)移動代理平臺交互。采用無線網(wǎng)絡(luò)作為傳輸介質(zhì)。創(chuàng)建監(jiān)控代理、報警代理、配置代理,并派遣到各現(xiàn)場監(jiān)控網(wǎng)絡(luò)點完成相應(yīng)的執(zhí)行任務(wù)。作業(yè)區(qū)移動代理平臺獲取所需生產(chǎn)、安全、設(shè)備狀態(tài)等信息,通過Struts 2框架的agletaction完成代理平臺中相應(yīng) Aglet與數(shù)據(jù)持久層的交互,使得數(shù)據(jù)永久保存到Oracle數(shù)據(jù)庫中。設(shè)備狀態(tài)Bean、數(shù)據(jù)查詢Bean、報警Bean在控制中心的調(diào)度下,通過DAO與數(shù)據(jù)庫交互,完成與相應(yīng)視圖的綁定,中心 Web服務(wù)器解析 JSP視圖頁面,然后轉(zhuǎn)發(fā)解析后的HTML頁面,分別呈現(xiàn)給生產(chǎn)、安全、管理部門以及移動 Web用戶,最終實現(xiàn)現(xiàn)場數(shù)據(jù)的遠程監(jiān)控和現(xiàn)場設(shè)備的控制。該平臺體系結(jié)構(gòu)如圖3所示。
圖3 Aglet-Struts 2移動代理平臺體系結(jié)構(gòu)
系統(tǒng)基于 MVC Struts 2框架,采用 IBM Aglet Workbench作為Mobile Agent開發(fā)支撐平臺。開發(fā)工具選擇Eclipse,服務(wù)器操作系統(tǒng)為Linux,中心Web服務(wù)器為tomcat,數(shù)據(jù)庫為Oracle。采用Tahiti Server作為服務(wù)代理來管理Aglet的移動,并提供通信、安全等服務(wù)。
由于要把Aglet整合到Struts 2框架中,因此必須在框架中開發(fā)一個服務(wù)代理agletaction,由它來控制移動 Aglet的運行。通過控制中心 action啟動agletaction服務(wù)代理對象,然后利用該服務(wù)代理對象調(diào)用移動代理 Aglet完成數(shù)據(jù)庫的查詢和更新操作。
在Eclipse下無法運行Aglets程序,采用在Eclipse環(huán)境下編譯Java源程序,然后放到Tahiti下運行。由于氣礦移動代理平臺與作業(yè)區(qū)移動代理平臺屬于主從關(guān)系模式,因此氣礦移動平臺中的master Aglet把任務(wù)委派給作業(yè)區(qū)Slave Agent,Slave Agent移動到現(xiàn)場完成數(shù)據(jù)采集任務(wù)或控制任務(wù)后返回結(jié)果。
創(chuàng)建作業(yè)區(qū)Slave Agent是在Aglet類中的run()方法中進行,主要代碼如下:
String host=getAgletContext().getHostingURL().toString();
URL dest=new URL(“atp://admin:4500”);
AgletProxy thisProxy=getAgletContext().getAgletProxy(getAgletID());
getAgletContext().createAglet(getCodeBase(),”mySlave”,null);
首先使用 getHostingURL()方法獲得當前執(zhí)行環(huán)境的 URL;接著創(chuàng)建一個 URL對象,指定子 Agent將被派往的目標主機地址,通過在getAgletProxy()方法中指定當前Aglet,即主Agent的ID獲得其代理;方法 createAglet用于創(chuàng)建子 Agent。其中,getCodeBase()用來獲得包含Aglet類代碼所在位置。當子 Agent被創(chuàng)建時會首先調(diào)用方法:onCreation(Object args){},接著將自身派至目標主機 dispatch(destination)。
本文將Aglet引入到Struts 2框架中,提出了基于移動代理的 Aglet-Struts 2集成框架。該框架通過構(gòu)建一個服務(wù)代理 agletaction,把移動代理平臺和Struts 2緊密聯(lián)系起來,既發(fā)揮了移動Agent減少網(wǎng)絡(luò)開銷、平均負載和提高任務(wù)時效的優(yōu)點,又發(fā)揮了Web框架Struts 2結(jié)構(gòu)清晰、代碼簡潔、易于部署、操作簡單和跨平臺的優(yōu)勢。
將該框架應(yīng)用到氣田生產(chǎn)數(shù)據(jù)遠程監(jiān)控系統(tǒng)中,較好地解決了移動Agent與Web互操作問題,提高了數(shù)據(jù)監(jiān)控的及時性和穩(wěn)定性。該框架的成功應(yīng)用為復雜分布式計算提供了新的模式和手段。
[1]Hu Jian, Zhao Rui, Qiu Xiaomei.A Network Management Model Based on Mobile Agent System[C]//Proc.of International Conference on Apperceiving Computing and Intelligence Analysis.[S.l.]: IEEE Press, 2008: 279-283.
[2]Oshima M, Karjoth G, Ono K.Aglets Specification 1.1 Draft[EB/OL]. (2009-05-02). http://www.trl.ibm.com/aglets/spec11.htm.
[3]Chen Caixian, Li Li.The Analysis of Struts Framework and Its Improvement[J].Computer Applications and Software, 2010, 27(1): 26-28.
[4]Papastavrou S, Samaras G, Pitoura E.Mobile Agents for World Wide Web Distributed Database Access[J].IEEE Transactions on Knowledge and Data Engineering, 2000,12(5): 802-820.
[5]Jou Ahyh-Hong, Kao Shang-Juh.Agent-based Infrastructure and an Application to Internet Information Gathering[J].Knowledge and Information System, 2002,4(1): 80-95.
[6]馬淑嬌, 葉春明, 楊堅爭.Mobile Agent在分布式數(shù)據(jù)庫信息查詢的應(yīng)用研究[J].計算機工程與科學, 2010,32(6): 103-108.
[7]Xua Yingyue, Qi Hairong.Mobile Agent Migration Modeling and Design for Target Tracking in Wireless Sensor Networks[J].Ad Hoc Networks, 2008, 6(1): 1-16.
[8]Zgaya H, Hammadi S, Gh’edira K.A Migration Strategy of Mobile Agents for the Transport Network Applications[J].Mathematics and Computers in Simulation, 2008, 76(5-6):345-362.
[9]劉大有, 楊 博, 楊 鯤, 等.基于旅行圖的移動Agent遷移策略[J].計算機研究與發(fā)展, 2003, 40(6): 838-845.
[10]張云勇, 劉錦德.移動 Agent技術(shù)[M].北京: 清華大學出版社, 2003.
[11]Sayyaadi H, Moarref M.A Distributed Algorithm for Proportional Task Allocation in Networks of Mobile Agents[J].IEEE Transactions on Automatic Control, 2011,56(2): 405-410.