摘 要: 在基于.Net平臺(tái)的信息系統(tǒng)開發(fā)過(guò)程中,組件-控件的復(fù)用已經(jīng)很常見,但是,邏輯流程部分的代碼始終沒(méi)有得到有效的縮減。針對(duì)這種現(xiàn)狀,提出對(duì)插件虛擬機(jī)的研究。在組件-控件和功能模塊間抽象一層“插件”,將信息系統(tǒng)劃分為不同的“插件”,通過(guò)XML配置文件來(lái)定義“插件”間的邏輯關(guān)系,同時(shí),“插件”也可以很好地實(shí)現(xiàn)功能的復(fù)用。插件虛擬機(jī)用于解釋執(zhí)行該配置文件。
關(guān)鍵詞: XML;插件;虛擬機(jī);業(yè)務(wù)邏輯
虛擬機(jī)并不是新技術(shù),早在20世紀(jì)六七十年代,IBM研究中心就在試驗(yàn)室里實(shí)現(xiàn)了其主機(jī)的鏡像,算是最原始的虛擬機(jī)了。之后一段時(shí)間發(fā)展緩慢,一度由于分時(shí)操作系統(tǒng)的出現(xiàn)而處于停滯狀態(tài)。20世紀(jì)90年代隨著Java虛擬機(jī)的推出,使對(duì)虛擬機(jī)技術(shù)的研究成為處理器設(shè)計(jì)人員、軟件設(shè)計(jì)人員、服務(wù)器設(shè)計(jì)人員和網(wǎng)絡(luò)安全設(shè)計(jì)人員的熱門研究課題。虛擬機(jī)并不只是應(yīng)用于對(duì)操作系統(tǒng),目前,在具體應(yīng)用領(lǐng)域的虛擬機(jī)開發(fā)得到迅速發(fā)展。這里將虛擬機(jī)的概念首次應(yīng)用到Net環(huán)境下的信息系統(tǒng)的開發(fā)過(guò)程中。
為了便于理解插件虛擬機(jī)的作用,首先介紹一種自動(dòng)化業(yè)務(wù)流程規(guī)范語(yǔ)言——業(yè)務(wù)流程執(zhí)行語(yǔ)言BPEL(Business Process Execution Language),這與插件虛擬機(jī)中用XML配置文件實(shí)現(xiàn)業(yè)務(wù)邏輯有相似之處。BPEL是基于XML和Web服務(wù)的,用XML文檔寫入BPEL中的流程能在Web服務(wù)之間以標(biāo)準(zhǔn)化的交互方式得到精心組織,它簡(jiǎn)化了將多個(gè)Web服務(wù)合成到一個(gè)新的業(yè)務(wù)流程中的操作[1]。這些流程能夠在任何一個(gè)符合BPEL規(guī)范的平臺(tái)或產(chǎn)品上執(zhí)行。BPEL通過(guò)合作伙伴連接來(lái)實(shí)現(xiàn)服務(wù)的調(diào)用,合作伙伴連接只定義所要調(diào)用的接口,它是一個(gè)抽象的網(wǎng)絡(luò)服務(wù)描述語(yǔ)言WSDL(Web Services Description Language)接口,這個(gè)接口在BPEL運(yùn)行時(shí)再綁定到真正的服務(wù)提供者上面[2]。這樣使接口和實(shí)現(xiàn)之間達(dá)到了一種松散耦合的效果,Web Service實(shí)現(xiàn)了接口的可重用性,而BPEL實(shí)現(xiàn)的是流程的可重用性。在XML配置文件中,“插件”類似于Web Service的接口,而BPEL對(duì)Web Service提供的服務(wù)類似于XML配置文檔對(duì)“插件”的執(zhí)行順序的控制。插件虛擬機(jī)的研究,提出了一種新的業(yè)務(wù)邏輯部分的實(shí)現(xiàn),在此之前,業(yè)務(wù)邏輯部分只能通過(guò)程序代碼實(shí)現(xiàn),現(xiàn)在轉(zhuǎn)換成只需要編寫描述性的文本語(yǔ)言,從而有效減少開發(fā)工作量,降低軟件開發(fā)成本。
1 相關(guān)名詞簡(jiǎn)介
1.1 虛擬機(jī)
虛擬機(jī)按其表面意思來(lái)理解就是指虛擬的機(jī)器,這個(gè)機(jī)器并不是由真實(shí)的硬件所組成,而是通過(guò)軟件系統(tǒng)虛擬而成的具有跟真正機(jī)器類似功能的一種實(shí)現(xiàn)[3-5]。“插件虛擬機(jī)”的命名,是因?yàn)槠湓O(shè)計(jì)思想與計(jì)算機(jī)的基本思想相類似:計(jì)算機(jī)的工作基于存儲(chǔ)程序與程序控制,其中存儲(chǔ)程序包括對(duì)程序及運(yùn)行中所需數(shù)據(jù)的存儲(chǔ),程序控制指計(jì)算機(jī)對(duì)程序中一條條指令的取出、分析與執(zhí)行[6];在插件虛擬機(jī)中,其主要工作是數(shù)據(jù)的存儲(chǔ)與插件的控制,數(shù)據(jù)的存儲(chǔ)包括外界輸入的數(shù)據(jù)及運(yùn)行時(shí)數(shù)據(jù)的存儲(chǔ),插件的控制包括插件的取出、分析與執(zhí)行。從功能上看,CPU的內(nèi)部結(jié)構(gòu)分為控制單元、邏輯單元和存儲(chǔ)單元3大部分[7],這3個(gè)部分互相協(xié)調(diào)進(jìn)行分析、判斷、運(yùn)算,并控制計(jì)算機(jī)各部件進(jìn)行工作。插件虛擬機(jī)中根據(jù)各部分具體實(shí)現(xiàn)的功能,可以把它分為如下幾部分:插件運(yùn)行時(shí)、插件執(zhí)行器、路由規(guī)則器、插件管理器、消息管理器、線程管理器、共享數(shù)據(jù)堆和運(yùn)行時(shí)上下文。通過(guò)這幾部分的相互協(xié)作,共同完成信息系統(tǒng)中插件的有序調(diào)用與執(zhí)行。
1.2 插件
在開發(fā)信息系統(tǒng)軟件的時(shí)候,現(xiàn)在最常見的做法是把軟件按功能模塊來(lái)劃分,將每個(gè)功能模塊分別設(shè)計(jì)好之后,最后再組合起來(lái)形成最終的信息系統(tǒng)軟件。目前,在程序復(fù)用方面,最常見的是組件復(fù)用,最具有代表性的是微軟公司的組件對(duì)象模型COM(Component Object Model)和Sun公司的企業(yè)級(jí)JavaBean EJB(Enterprise JavaBean)。COM是基于分布式對(duì)象模型的開放標(biāo)準(zhǔn),它詳細(xì)規(guī)定了一個(gè)COM組件所應(yīng)具有的二進(jìn)制內(nèi)存結(jié)構(gòu)是組件集成的框架,這個(gè)框架支持對(duì)象的互操作性和可重用性[8-9],COM組件的創(chuàng)建由COM庫(kù)和類工廠協(xié)作完成,它是ActiveX技術(shù)的基礎(chǔ),并且運(yùn)用于大多數(shù)的Windows編程;EJB是一種基于Java環(huán)境的針對(duì)服務(wù)器端的組件模型[10],其設(shè)計(jì)目標(biāo)與核心應(yīng)用是部署分布式應(yīng)用程序,同時(shí)它定義了一個(gè)用于開發(fā)基于組件的企業(yè)多重應(yīng)用程序的標(biāo)準(zhǔn),EJB技術(shù)簡(jiǎn)化了用Java語(yǔ)言編寫企業(yè)級(jí)應(yīng)用系統(tǒng)的開發(fā)、配置和執(zhí)行[11]。插件虛擬機(jī)中的“插件”是在模塊、控件-組件中抽象出來(lái)的,單個(gè)模塊中可以包含多個(gè)插件,插件中可以包含控件和組件,在復(fù)雜的應(yīng)用系統(tǒng)中可以實(shí)現(xiàn)插件的嵌套,例如:信息系統(tǒng)首先劃分為幾個(gè)插件,插件中可以包含功能模塊,然后功能模塊中再包含插件。
2 虛擬機(jī)的設(shè)計(jì)及實(shí)現(xiàn)
2.1 組成結(jié)構(gòu)
插件虛擬機(jī)的工作是圍繞“插件”的調(diào)用展開的,信息系統(tǒng)被劃分為插件的形式,插件被統(tǒng)一定義在配置文件中,其中插件的編碼與實(shí)現(xiàn)插件的類相互對(duì)應(yīng),便于插件虛擬機(jī)在合適的場(chǎng)景與環(huán)境中調(diào)用插件。根據(jù)插件虛擬機(jī)要完成的功能將其分為以下幾部分,其結(jié)構(gòu)圖如圖1所示。
(1)插件虛擬機(jī)運(yùn)行時(shí),為插件提供面向操作系統(tǒng)和Net環(huán)境的基礎(chǔ)服務(wù),解釋模塊配置文件,根據(jù)模塊配置文件創(chuàng)建各種子系統(tǒng);
?。?)上下文管理器,提供對(duì)插件虛擬機(jī)傳入的參數(shù)的封裝;
?。?)共享數(shù)據(jù)堆,提供插件間的數(shù)據(jù)共享服務(wù);
?。?)消息管理器,提供插件間的消息發(fā)送功能;
?。?)插件管理器,負(fù)責(zé)查找、加載、緩存插件;
(6)插件執(zhí)行器,負(fù)責(zé)從插件池中取出插件,執(zhí)行插件,并根據(jù)插件參數(shù)確定插件顯示模式;
?。?)路由規(guī)則器,主要負(fù)責(zé)確定下一個(gè)需要執(zhí)行的插件的id,并將插件id發(fā)送給插件執(zhí)行器,由插件執(zhí)行器運(yùn)行id對(duì)應(yīng)的插件;
?。?)線程管理器,提供操作系統(tǒng)的線程封裝服務(wù),提供線程間數(shù)據(jù)傳遞服務(wù)。
2.2 插件虛擬機(jī)的實(shí)現(xiàn)
插件虛擬機(jī)的實(shí)現(xiàn),有其完備的執(zhí)行過(guò)程,不僅能夠完成基本的功能,而且能夠處理運(yùn)行過(guò)程中產(chǎn)生的各種異常。其主要的技術(shù)點(diǎn)包括:插件間數(shù)據(jù)的存儲(chǔ)、插件的生命周期以及接口規(guī)范等。啟動(dòng)插件虛擬機(jī),會(huì)檢查各部分的完整性并加載XML配置文件中定義的所有“插件”,用戶界面輸入的數(shù)據(jù)會(huì)在插件虛擬機(jī)中的得到相應(yīng)的處理并觸發(fā)相應(yīng)“插件”的執(zhí)行。插件虛擬機(jī)的工作流程如圖2所示。
插件虛擬機(jī)運(yùn)行時(shí),主要包括以下步驟:
?。?)插件虛擬機(jī)運(yùn)行時(shí)加載并讀取配置文件信息,根據(jù)配置文件創(chuàng)建子系統(tǒng)。子系統(tǒng)包括:路由規(guī)則器、消息管理器、共享數(shù)據(jù)堆、線程管理器、上下文管理器、插件管理器、插件執(zhí)行器。然后,插件虛擬機(jī)運(yùn)行時(shí)調(diào)用插件管理器;
(2)插件管理器加載配置文件中涉及到的插件,由加載單元通過(guò)Net環(huán)境調(diào)用操作系統(tǒng),在操作系統(tǒng)下查找插件。插件虛擬機(jī)運(yùn)行時(shí)包含在名為pluginvm core.dll的動(dòng)態(tài)鏈接庫(kù)中,為插件提供面向操作系統(tǒng)和Net環(huán)境的基礎(chǔ)服務(wù)。具體包括:
?、傥募僮骷奥窂讲檎曳?wù);
?、谖ㄒ恢鳈C(jī)碼創(chuàng)建(包含CPU-網(wǎng)卡),即密碼驗(yàn)證服務(wù),通過(guò)讀取主機(jī)唯一的CPU序列號(hào)以及網(wǎng)卡的序列號(hào),按照相應(yīng)的公式計(jì)算出驗(yàn)證碼,與軟件中存儲(chǔ)的密碼相匹配,保障了軟件安裝合法性,可以有效防止盜版;
?、奂用芙饷?;
④面向Window操作系統(tǒng)API的托管封裝;
?、萁忉屇K配置文件,根據(jù)模塊配置文件創(chuàng)建各種子系統(tǒng)。
插件管理器查找到所有的配置文件中涉及到的插件后,確認(rèn)可用的插件然后加載,插件管理器加載完畢后,等待插件執(zhí)行器調(diào)用。
加載配置文件中將插件加載至插件管理器中,由插件管理器統(tǒng)一管理加載的插件,并且將參數(shù)存儲(chǔ)至上下文管理器中。上下文管理器提供對(duì)運(yùn)行插件虛擬機(jī)傳入的參數(shù)的封裝,具體為一個(gè)面向?qū)ο蟮墓1恚?br />
?。?)路由規(guī)則器根據(jù)插件執(zhí)行器調(diào)用插件后返回的結(jié)果或者根據(jù)加載單元提供的插件調(diào)用入口點(diǎn)確定插件執(zhí)行器需要執(zhí)行的插件編碼,并將該插件編碼傳遞給插件執(zhí)行器;
?。?)插件執(zhí)行器接收路由規(guī)則器傳入的插件編碼,并從上下文管理器中獲得和本插件相關(guān)的參數(shù);插件執(zhí)行器通過(guò)調(diào)用插件的約定方法并在調(diào)用時(shí)傳入從上下文管理器中獲得的參數(shù)來(lái)執(zhí)行插件;
將插件執(zhí)行過(guò)程中產(chǎn)生的數(shù)據(jù),存儲(chǔ)至共享數(shù)據(jù)堆中,以供其他插件調(diào)用。不同的插件可以將需要共享的數(shù)據(jù)放入共享數(shù)據(jù)堆中,插件虛擬機(jī)退出后共享數(shù)據(jù)堆可以自動(dòng)回收。插件虛擬機(jī)維護(hù)共享數(shù)據(jù)堆中的數(shù)據(jù)的引用計(jì)數(shù),當(dāng)數(shù)據(jù)引用計(jì)數(shù)為0的時(shí)候,共享數(shù)據(jù)將被自動(dòng)回收。
插件執(zhí)行器負(fù)責(zé)從插件管理器中取出插件,調(diào)用插件的特定方法Excute Plugin(PluginParam param)執(zhí)行插件;插件執(zhí)行器還負(fù)責(zé)處理插件異常信息,如果遇到需要退出插件虛擬機(jī)的異常則直接調(diào)用插件虛擬機(jī)提供的退出函數(shù)ExitVm(Excption ecode)退出插件虛擬機(jī)。
插件執(zhí)行器執(zhí)行完畢當(dāng)前插件后,還將當(dāng)前插件運(yùn)行完畢后返回的數(shù)據(jù)轉(zhuǎn)發(fā)至路由規(guī)則器中,路由規(guī)則器根據(jù)插件執(zhí)行器返回的數(shù)據(jù)確定下一個(gè)需要執(zhí)行的插件的編碼,并將插件編碼發(fā)送給插件執(zhí)行器,由插件執(zhí)行器運(yùn)行編碼對(duì)應(yīng)的插件。
?。?)插件間可以通過(guò)插件虛擬機(jī)發(fā)送/接收消息。消息管理器包括消息隊(duì)列和消息派發(fā)器,消息隊(duì)列接收消息,并將其加入隊(duì)列,消息派發(fā)器按照隊(duì)列順序?qū)⑾⑴砂l(fā)給該消息所指定的插件。消息中攜帶有需要執(zhí)行插件的信息,消息管理器向插件管理器中的需要執(zhí)行的插件(若插件管理器中沒(méi)有加載所述的需要執(zhí)行的插件,則由插件管理器重新加載,然后由插件執(zhí)行器執(zhí)行。具體過(guò)程與初始加載插件時(shí)一致:由加載單元通過(guò)Net環(huán)境調(diào)用操作系統(tǒng),在操作系統(tǒng)下查找插件。加載后的插件存儲(chǔ)至插件管理器中,參數(shù)存儲(chǔ)至參數(shù)封裝單元中,然后由插件執(zhí)行器可以調(diào)用)派發(fā)該消息,由插件管理器將該插件的編碼傳給插件執(zhí)行器,最終插件執(zhí)行器根據(jù)該插件的編碼執(zhí)行該插件。消息管理器的功能還有:消息隊(duì)列,負(fù)責(zé)存儲(chǔ)插件發(fā)送過(guò)來(lái)的消息,并按照先后順序排成隊(duì)列的形式。其中,插件需要實(shí)現(xiàn)AcceptRunMsg(RunMessage msg)接口接收插件管理器發(fā)送的消息。
目前,隨著軟件行業(yè)的發(fā)展,其規(guī)模和復(fù)雜性提高、使用范圍擴(kuò)大,為了便于維護(hù)和管理,軟件開發(fā)過(guò)程中逐漸出現(xiàn)對(duì)開發(fā)方法的研究、軟件管理的規(guī)范、體系結(jié)構(gòu)的分離[12]。在開發(fā)信息系統(tǒng)軟件過(guò)程中,通常會(huì)將一個(gè)系統(tǒng)分為幾個(gè)相互獨(dú)立的功能模塊,由不同人員來(lái)開發(fā),最后再根據(jù)用戶的操作邏輯和業(yè)務(wù)邏輯組織起來(lái)。通過(guò)對(duì)插件虛擬機(jī)的研究,實(shí)現(xiàn)了縮減業(yè)務(wù)邏輯部分代碼,首次提出用配置文件的描述語(yǔ)言代替業(yè)務(wù)邏輯部分的代碼;其次,以“插件”的形式來(lái)實(shí)現(xiàn)信息系統(tǒng)中程序的復(fù)用,同一“插件”可以被多個(gè)模塊的配置文件使用。由此,可以降低軟件開發(fā)成本,縮短周期,增強(qiáng)可讀性,更加便于維護(hù)和管理。
參考文獻(xiàn)
[1] 劉樹軍,王炳同,李莉.基于WS-BPEL的Web服務(wù)組合技術(shù)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2012(8):206-209.
[2] 陳建飛,申晨光,韓偉力.面向WS-BPEL的訪問(wèn)控制策略合成研究[J].計(jì)算機(jī)應(yīng)用與軟件,2012,29(3):195-197.
[3] 劉菲軍,陳俊杰,郭濤,等.云計(jì)算下虛擬機(jī)部署機(jī)制的研究[J].電腦開發(fā)與應(yīng)用,2012(5):4-6.
[4] 鄧維,廖小飛,金海.基于虛擬機(jī)的數(shù)據(jù)中心能耗管理機(jī)制[J].中興通訊技術(shù),2012(4):15-18.
[5] Wu Dongyao, Wei Jun, Gao Chushu, et al. Event-driven process execution model for virtual machine[J]. Computer Integrated Manufacturing Systems, 2012(8): 1675-1685.
[6] 詹姆斯,瑞維著,安虹,等譯.虛擬機(jī):系統(tǒng)與進(jìn)程的通用平臺(tái)第二版[M].北京:機(jī)械工業(yè)出版社,2009.
[7] EMOTO, MASAHIKO, YOSHIDA, et al. Application of virtual machine technology to real-time mapping of Thomson scattering data to flux coordinates for the LHD[J]. Fusion Engineering and Design, 2012(87): 2076-2080.
[8] 劉春泉,周紹梅,劉小東.COM在軟件復(fù)用中的應(yīng)用[J].計(jì)算機(jī)與現(xiàn)代化,2005(5):28-30.
[9] 潘恒.中間件技術(shù)——COM組件的探究[J].科協(xié)論壇:下半月,2011(4):61-62.
[10] 喬波.新一代EJB組件技術(shù)研究[J].科技信息,2009(5):62-63.
[11] 劉秋梅,鄭耿忠.EJB組件技術(shù)在數(shù)字參考咨詢系統(tǒng)中的應(yīng)用[J].圖書館學(xué)刊,2010(12):85-87.
[12] 夏明忠,夏以軒,李兵元.軟件模塊化設(shè)計(jì)和模塊化管理[J].中國(guó)信息界,2012(11):56-59.