楊 力,陳利學,趙永清,廖浩德
(1.西南石油大學計算機科學學院,成都 610500;2.四川大學計算機學院,成都 610065)
隨著Internet復雜程度的不斷提高和新型網絡分布式應用的出現,基于 DCOM/CORBA/EJB的傳統C/S分布式計算模型日益暴露出其缺點,已遠不能滿足當今快速多變的網絡應用需求。移動Agent技術集智能Agent、分布式計算、通信于一體,提供了強大、統一、開放的計算模式,適合提供復雜的業務邏輯,并能夠遷移到遠程主機執行,大幅降低了網絡帶寬,能有效克服網絡不穩定、負載性能和效能等問題。
但是目前大多數應用都是基于Web的應用開發,由于 Web應用的大型化、功能日益復雜,傳統 Web頁面與業務邏輯混合開發的開發模式已不能適應快速開發的需要,急需一種既能實現企業 Web開發、縮短開發周期、節省開發成本,又易于修改、維護和擴展的開發框架。
本文通過研究移動 Agent理論和 Web開發框架關鍵技術,分析Agent與MVC模式的結合優勢,提出基于移動代理的Aglet-Struts Web應用集成框架,使Aglet在 Struts控制器 action統一調度下,完成 JSP、action和Aglet的交互,實現了顯示和邏輯的完全分離[1]。
Aglet是最早基于Java的移動Agent開發平臺之一,Aglet的名字來源于 Agent和 Applet,可以簡單地將其看成具有Agent行為的Applet對象。由于Aglet本身具有的主動性、能動性、社交能力、反應能力,與傳統C/S模式、移動代碼技術、DCOM等技術相比,Aglet集中了它們的優點。
Aglet使得程序的執行盡可能地靠近數據源,降低網絡的通信開銷,平均負載,提高完成任務的時效,在各Aglet間交互方面表現出了強大的優勢和靈活性[2]。
由于 Web應用的逐漸普及,利用基于 MVC的Struts 2框架已經成為構建靈活、高效、易于部署、跨平臺的分布式應用程序的主流技術。Struts框架成功實現服務端的模塊化,將 Web應用劃分為控制器(action)、模型(javaBean)、視圖(JSP)。
各組件間實現了松耦合,為大型項目開發提供優勢,主要體現在:(1)組件化便于在開發中劃分職責,有利于代碼重用;(2)可以通過控制器action控制系統全局流程;(3)模塊化,通過 javaBean實現新業務,無需修改整個應用,便于后期維護和業務擴展[3-4]。
Aglet間的交互比較容易,Aglet與 Web的交互卻很困難,這樣在Web應用中就不能充分體現Aglet的優勢。但是把Aglet看作是Struts框架中的模型,即業務邏輯,通過Struts 框架把Aglet、控制器(action)和 JSP頁面三者有機結合,實現 Web前端與 Aglet的互操作。這樣就可以充分體現Aglet和Struts框架的優勢,為構建更加靈活、高效、異構的 Web應用框架提供新的手段,具有重要的意義。
如圖1所示,把Aglet引入到Struts 2框架中,將應用程序分成 3個核心部件:模型(Aglet、Javabean),視圖(JSP),控制器(Action、AgletAction),實現 Struts 2與Aglet的整合[5]。

圖1 基于MVC的Aglet-Struts 2框架結構
該整合框架模型由6個層組成,分別是表示層、控制層、業務層、持久層、MA服務層和Aglet子系統層。這種框架使用軟件分層的思想,將軟件的表示層、控制層和邏輯層分開,各層完成自己的功能,避免了以前的軟件開發中各部分的功能集中在一起所帶來的維護和修改困難問題。
(1)表示層即MVC模式中的視圖部分,此層主要由一組JSP文件組成,完成用戶界面展示,用戶通過瀏覽器訪問系統界面實現與服務器端控制器交互。該層不應該存在模型信息,只有標簽,這些標簽可以是標準的JSP標簽,也可以是用戶自定義的標簽[6-7]。
(2)控制層即MVC模式中的控制部分,此層繼承action類,扮演中央控制器的角色。利用 struts.xml配置信息,根據action名字與類名的映射關系,調用適當的action對象實現對模型的控制。action類負責調用模型的方法,更新模型的數據狀態,并控制一個具體的應用流程,它本身也可以完成一些實際的業務邏輯[8]。
action控制器充當用戶請求和業務邏輯處理之間的適配器,將請求與業務邏輯分開。它側重于控制應用程序的流程,應用程序的邏輯放在單獨的 Java文件中,這樣可以提高應用程序的靈活性和可重用性。
在Aglet-Struts 2框架中有一個特殊的action,即AgletAction,它用來控制移動Aglet子系統中的業務流程,移動 Aglet子系統中主要由一個或多個AgletServer組件和Context內創建的Aglet組件組成,它們之間的關系如圖2所示。

圖2 AgletAction與AgletServer的關系
(3)業務層即 MVC模型部分。主要以 JavaBean或 Aglet形式存在,主要處理表現層的請求并利用DAO(封裝了對底層數據庫的操作)組件進行持久層操作、Remoting與 MA服務層交互并將所得信息在業務層進行匯總并以 JSP頁面的形式將信息反饋給用戶[9]。
(4)持久層主要利用持久層框架如Hibernate進行底層數據庫的持久操作,從而實現對數據庫訪問的透明化處理。數據庫的連接管理、事務處理由框架的容器處理,從而提高數據存儲與訪問效率。
(5)MA服務層通過一個 Java類,實現自定義的AgletServer,該 Server具有創建 Aglet并為 Aglet的運行提供Aglet上下文環境(Aglet Context)和Aglet間通信的代理機制。創建好的Aglet能夠被派遣到子系統執行相應的任務。同時利用 Remoting將此層導出為RMI服務供業務層調用,從而實現業務層與Aglet子系統的整合。
(6)Aglet子系統層直接由Aglet系統提供的Tahiti服務器作為MA的運行環境,接收從MA服務層派遣過來的 Aglet,并由此 Aglet執行相應的業務處理任務。MA服務層和子系統管理層,子系統管理層和子系統管理層間采用ATP(Aglet Transfer Protocol代理傳輸協議)進行通信,信息的傳遞通過獲取Aglet代理(AgletProxy)來實現。
用戶(User)通過瀏覽器(Browser)訪問中心Web服務器,并提出HTTP請求。
HTTP請求被運行在 Web服務器上的 Struts PrepareAndExecuteFilter(實際是一個 Servelet,被定義在 Web.xml文件中)所攔截,并轉交給相應的控制器(action)處理。
控制器分為頁面跳轉控制器、用戶控制器、業務邏輯控制器,并定義在 struts.xml文件中。頁面跳轉主要用于實現頁面間的跳轉。用戶登錄控制用于驗證用戶的操作權限。業務邏輯處理控制用于處理各個模塊之間的業務。當控制器處理完轉交給它的請求時,通過result屬性返回一個攜帶數據的視圖,并通過視圖解析器(View Resolver)解析JSP為HTML頁面并呈現給用戶。控制器通過數據訪問對象(DAO)與持久層框架交互實現底層分布式數據庫訪問。通過 RMI對MA服務(MA Server)的訪問,實現控制器與MA的交互,從而實現Web應用與MA交互的整合。
MA服務層(MA Server)處理從控制器傳來的請求,生成相應的Aglet并派遣到MA子管理系統上執行任務。比如生成靜態Aglet并派遣到子管理系統上,此靜態Aglet常駐在子管理系統上,并根據MA服務層所初始的 IP地址表,對派遣到的各子管理系統進行監控。在執行網絡任務時,靜態Aglet會對所收集的數據進行處理和過濾,并調用DAO與持久層交互并將實時數據存入分布式數據庫中。
當中心 Web服務器要獲取各個子管理系統所管理的數據時,可以利用 MA服務層生成一個消息Aglet,此消息 Aglet攜帶各個子管理系統的 IP表,根據這個IP表,此消息Aglet就可以在各個子管理系統間遷移。當消息Aglet到達子管理系統時,它與常駐其上的靜態Aglet通信,獲得所管理的數據并遷移到下一個子管理系統,直到遍歷完所有的子管理系統后返回 MA服務層。MA服務層接收返回的消息Aglet,提取其中的數據,返回給相應的控制器處理。控制器再返回相應的視圖JSP,并調用視圖解析器解析JSP頁面并呈現給用戶,供用戶查詢和分析[10-11]。
由于氣田的廣泛分布性,氣田各井站離管理中心一般相距較遠,形成了以作業區、氣礦(營銷部)、分公司3級管理體系。井站數據通過語音電話、手持移動設備或自動化采集等方式經由無線網絡實時進入作業區數據庫。作業區數據庫存儲詳細的基礎數據。氣礦(營銷部)數據庫存儲本單位管轄區一定綜合數據,同時在作業區和氣礦級實施遠程 Web監控。分公司數據庫存儲本公司管轄的各礦區(營銷部)的綜合數據。作業區與氣礦(營銷部)之間網絡連接形式多樣,速率不等,導致其穩定性較低,而客戶服務器模式要求實時在線,在數據量大的情況下,可靠性較差。基于移動代理的Struts 2 MVC分布式集成框架,能有效解決系統運行的穩定性和 Web瀏覽的及時性的矛盾,特別適合氣田遠程監控分布式計算的需要。
遠程監控移動代理平臺負責與作業區移動代理平臺交互。采用無線網絡作為傳輸介質。創建監控代理、報警代理、配置代理,并派遣到各現場監控網絡點完成相應的執行任務。作業區移動代理平臺獲取所需生產、安全、設備狀態等信息,通過Struts 2框架的agletaction完成代理平臺中相應 Aglet與數據持久層的交互,使得數據永久保存到Oracle數據庫中。設備狀態Bean、數據查詢Bean、報警Bean在控制中心的調度下,通過DAO與數據庫交互,完成與相應視圖的綁定,中心 Web服務器解析 JSP視圖頁面,然后轉發解析后的HTML頁面,分別呈現給生產、安全、管理部門以及移動 Web用戶,最終實現現場數據的遠程監控和現場設備的控制。該平臺體系結構如圖3所示。

圖3 Aglet-Struts 2移動代理平臺體系結構
系統基于 MVC Struts 2框架,采用 IBM Aglet Workbench作為Mobile Agent開發支撐平臺。開發工具選擇Eclipse,服務器操作系統為Linux,中心Web服務器為tomcat,數據庫為Oracle。采用Tahiti Server作為服務代理來管理Aglet的移動,并提供通信、安全等服務。
由于要把Aglet整合到Struts 2框架中,因此必須在框架中開發一個服務代理agletaction,由它來控制移動 Aglet的運行。通過控制中心 action啟動agletaction服務代理對象,然后利用該服務代理對象調用移動代理 Aglet完成數據庫的查詢和更新操作。
在Eclipse下無法運行Aglets程序,采用在Eclipse環境下編譯Java源程序,然后放到Tahiti下運行。由于氣礦移動代理平臺與作業區移動代理平臺屬于主從關系模式,因此氣礦移動平臺中的master Aglet把任務委派給作業區Slave Agent,Slave Agent移動到現場完成數據采集任務或控制任務后返回結果。
創建作業區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()方法獲得當前執行環境的 URL;接著創建一個 URL對象,指定子 Agent將被派往的目標主機地址,通過在getAgletProxy()方法中指定當前Aglet,即主Agent的ID獲得其代理;方法 createAglet用于創建子 Agent。其中,getCodeBase()用來獲得包含Aglet類代碼所在位置。當子 Agent被創建時會首先調用方法:onCreation(Object args){},接著將自身派至目標主機 dispatch(destination)。
本文將Aglet引入到Struts 2框架中,提出了基于移動代理的 Aglet-Struts 2集成框架。該框架通過構建一個服務代理 agletaction,把移動代理平臺和Struts 2緊密聯系起來,既發揮了移動Agent減少網絡開銷、平均負載和提高任務時效的優點,又發揮了Web框架Struts 2結構清晰、代碼簡潔、易于部署、操作簡單和跨平臺的優勢。
將該框架應用到氣田生產數據遠程監控系統中,較好地解決了移動Agent與Web互操作問題,提高了數據監控的及時性和穩定性。該框架的成功應用為復雜分布式計算提供了新的模式和手段。
[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在分布式數據庫信息查詢的應用研究[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].計算機研究與發展, 2003, 40(6): 838-845.
[10]張云勇, 劉錦德.移動 Agent技術[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.