摘 要: 在基于.Net平臺的信息系統(tǒng)開發(fā)過程中,,組件-控件的復(fù)用已經(jīng)很常見,,但是,邏輯流程部分的代碼始終沒有得到有效的縮減,。針對這種現(xiàn)狀,,提出對插件虛擬機(jī)的研究。在組件-控件和功能模塊間抽象一層“插件”,,將信息系統(tǒng)劃分為不同的“插件”,,通過XML配置文件來定義“插件”間的邏輯關(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ī)的推出,,使對虛擬機(jī)技術(shù)的研究成為處理器設(shè)計(jì)人員,、軟件設(shè)計(jì)人員、服務(wù)器設(shè)計(jì)人員和網(wǎng)絡(luò)安全設(shè)計(jì)人員的熱門研究課題,。虛擬機(jī)并不只是應(yīng)用于對操作系統(tǒng),,目前,在具體應(yīng)用領(lǐng)域的虛擬機(jī)開發(fā)得到迅速發(fā)展。這里將虛擬機(jī)的概念首次應(yīng)用到Net環(huán)境下的信息系統(tǒng)的開發(fā)過程中,。
為了便于理解插件虛擬機(jī)的作用,,首先介紹一種自動(dòng)化業(yè)務(wù)流程規(guī)范語言——業(yè)務(wù)流程執(zhí)行語言BPEL(Business Process Execution Language),這與插件虛擬機(jī)中用XML配置文件實(shí)現(xiàn)業(yè)務(wù)邏輯有相似之處,。BPEL是基于XML和Web服務(wù)的,,用XML文檔寫入BPEL中的流程能在Web服務(wù)之間以標(biāo)準(zhǔn)化的交互方式得到精心組織,它簡化了將多個(gè)Web服務(wù)合成到一個(gè)新的業(yè)務(wù)流程中的操作[1],。這些流程能夠在任何一個(gè)符合BPEL規(guī)范的平臺或產(chǎn)品上執(zhí)行,。BPEL通過合作伙伴連接來實(shí)現(xiàn)服務(wù)的調(diào)用,合作伙伴連接只定義所要調(diào)用的接口,,它是一個(gè)抽象的網(wǎng)絡(luò)服務(wù)描述語言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對Web Service提供的服務(wù)類似于XML配置文檔對“插件”的執(zhí)行順序的控制。插件虛擬機(jī)的研究,,提出了一種新的業(yè)務(wù)邏輯部分的實(shí)現(xiàn),,在此之前,業(yè)務(wù)邏輯部分只能通過程序代碼實(shí)現(xiàn),,現(xiàn)在轉(zhuǎn)換成只需要編寫描述性的文本語言,,從而有效減少開發(fā)工作量,降低軟件開發(fā)成本,。
1 相關(guān)名詞簡介
1.1 虛擬機(jī)
虛擬機(jī)按其表面意思來理解就是指虛擬的機(jī)器,,這個(gè)機(jī)器并不是由真實(shí)的硬件所組成,而是通過軟件系統(tǒng)虛擬而成的具有跟真正機(jī)器類似功能的一種實(shí)現(xiàn)[3-5],。“插件虛擬機(jī)”的命名,,是因?yàn)槠湓O(shè)計(jì)思想與計(jì)算機(jī)的基本思想相類似:計(jì)算機(jī)的工作基于存儲程序與程序控制,其中存儲程序包括對程序及運(yùn)行中所需數(shù)據(jù)的存儲,,程序控制指計(jì)算機(jī)對程序中一條條指令的取出,、分析與執(zhí)行[6];在插件虛擬機(jī)中,,其主要工作是數(shù)據(jù)的存儲與插件的控制,,數(shù)據(jù)的存儲包括外界輸入的數(shù)據(jù)及運(yùn)行時(shí)數(shù)據(jù)的存儲,插件的控制包括插件的取出,、分析與執(zhí)行,。從功能上看,,CPU的內(nèi)部結(jié)構(gòu)分為控制單元、邏輯單元和存儲單元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í)上下文,。通過這幾部分的相互協(xié)作,共同完成信息系統(tǒng)中插件的有序調(diào)用與執(zhí)行,。
1.2 插件
在開發(fā)信息系統(tǒng)軟件的時(shí)候,,現(xiàn)在最常見的做法是把軟件按功能模塊來劃分,將每個(gè)功能模塊分別設(shè)計(jì)好之后,,最后再組合起來形成最終的信息系統(tǒng)軟件,。目前,在程序復(fù)用方面,,最常見的是組件復(fù)用,,最具有代表性的是微軟公司的組件對象模型COM(Component Object Model)和Sun公司的企業(yè)級JavaBean EJB(Enterprise JavaBean)。COM是基于分布式對象模型的開放標(biāo)準(zhǔn),,它詳細(xì)規(guī)定了一個(gè)COM組件所應(yīng)具有的二進(jìn)制內(nèi)存結(jié)構(gòu)是組件集成的框架,,這個(gè)框架支持對象的互操作性和可重用性[8-9],COM組件的創(chuàng)建由COM庫和類工廠協(xié)作完成,,它是ActiveX技術(shù)的基礎(chǔ),,并且運(yùn)用于大多數(shù)的Windows編程;EJB是一種基于Java環(huán)境的針對服務(wù)器端的組件模型[10],,其設(shè)計(jì)目標(biāo)與核心應(yīng)用是部署分布式應(yīng)用程序,,同時(shí)它定義了一個(gè)用于開發(fā)基于組件的企業(yè)多重應(yīng)用程序的標(biāo)準(zhǔn),EJB技術(shù)簡化了用Java語言編寫企業(yè)級應(yīng)用系統(tǒng)的開發(fā),、配置和執(zhí)行[11],。插件虛擬機(jī)中的“插件”是在模塊、控件-組件中抽象出來的,,單個(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)插件的類相互對應(yīng),,便于插件虛擬機(jī)在合適的場景與環(huán)境中調(diào)用插件,。根據(jù)插件虛擬機(jī)要完成的功能將其分為以下幾部分,其結(jié)構(gòu)圖如圖1所示,。
?。?)插件虛擬機(jī)運(yùn)行時(shí),為插件提供面向操作系統(tǒng)和Net環(huán)境的基礎(chǔ)服務(wù),,解釋模塊配置文件,,根據(jù)模塊配置文件創(chuàng)建各種子系統(tǒng);
?。?)上下文管理器,,提供對插件虛擬機(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對應(yīng)的插件,;
(8)線程管理器,,提供操作系統(tǒng)的線程封裝服務(wù),,提供線程間數(shù)據(jù)傳遞服務(wù)。
2.2 插件虛擬機(jī)的實(shí)現(xiàn)
插件虛擬機(jī)的實(shí)現(xiàn),,有其完備的執(zhí)行過程,,不僅能夠完成基本的功能,而且能夠處理運(yùn)行過程中產(chǎn)生的各種異常,。其主要的技術(shù)點(diǎn)包括:插件間數(shù)據(jù)的存儲,、插件的生命周期以及接口規(guī)范等,。啟動(dòng)插件虛擬機(jī),,會檢查各部分的完整性并加載XML配置文件中定義的所有“插件”,用戶界面輸入的數(shù)據(jù)會在插件虛擬機(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)用插件管理器;
?。?)插件管理器加載配置文件中涉及到的插件,,由加載單元通過Net環(huán)境調(diào)用操作系統(tǒng),在操作系統(tǒng)下查找插件,。插件虛擬機(jī)運(yùn)行時(shí)包含在名為pluginvm core.dll的動(dòng)態(tài)鏈接庫中,,為插件提供面向操作系統(tǒng)和Net環(huán)境的基礎(chǔ)服務(wù)。具體包括:
?、傥募僮骷奥窂讲檎曳?wù),;
②唯一主機(jī)碼創(chuàng)建(包含CPU-網(wǎng)卡),,即密碼驗(yàn)證服務(wù),,通過讀取主機(jī)唯一的CPU序列號以及網(wǎng)卡的序列號,,按照相應(yīng)的公式計(jì)算出驗(yàn)證碼,與軟件中存儲的密碼相匹配,,保障了軟件安裝合法性,,可以有效防止盜版;
?、奂用芙饷?;
④面向Window操作系統(tǒng)API的托管封裝,;
?、萁忉屇K配置文件,根據(jù)模塊配置文件創(chuàng)建各種子系統(tǒng),。
插件管理器查找到所有的配置文件中涉及到的插件后,,確認(rèn)可用的插件然后加載,插件管理器加載完畢后,,等待插件執(zhí)行器調(diào)用,。
加載配置文件中將插件加載至插件管理器中,由插件管理器統(tǒng)一管理加載的插件,,并且將參數(shù)存儲至上下文管理器中,。上下文管理器提供對運(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í)行器通過調(diào)用插件的約定方法并在調(diào)用時(shí)傳入從上下文管理器中獲得的參數(shù)來執(zhí)行插件,;
將插件執(zhí)行過程中產(chǎn)生的數(shù)據(jù),,存儲至共享數(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)行編碼對應(yīng)的插件,。
(5)插件間可以通過插件虛擬機(jī)發(fā)送/接收消息,。消息管理器包括消息隊(duì)列和消息派發(fā)器,,消息隊(duì)列接收消息,并將其加入隊(duì)列,,消息派發(fā)器按照隊(duì)列順序?qū)⑾⑴砂l(fā)給該消息所指定的插件,。消息中攜帶有需要執(zhí)行插件的信息,消息管理器向插件管理器中的需要執(zhí)行的插件(若插件管理器中沒有加載所述的需要執(zhí)行的插件,,則由插件管理器重新加載,,然后由插件執(zhí)行器執(zhí)行。具體過程與初始加載插件時(shí)一致:由加載單元通過Net環(huán)境調(diào)用操作系統(tǒng),,在操作系統(tǒng)下查找插件,。加載后的插件存儲至插件管理器中,,參數(shù)存儲至參數(shù)封裝單元中,,然后由插件執(zhí)行器可以調(diào)用)派發(fā)該消息,由插件管理器將該插件的編碼傳給插件執(zhí)行器,,最終插件執(zhí)行器根據(jù)該插件的編碼執(zhí)行該插件,。消息管理器的功能還有:消息隊(duì)列,負(fù)責(zé)存儲插件發(fā)送過來的消息,,并按照先后順序排成隊(duì)列的形式,。其中,插件需要實(shí)現(xiàn)AcceptRunMsg(RunMessage msg)接口接收插件管理器發(fā)送的消息,。
目前,,隨著軟件行業(yè)的發(fā)展,其規(guī)模和復(fù)雜性提高,、使用范圍擴(kuò)大,,為了便于維護(hù)和管理,軟件開發(fā)過程中逐漸出現(xiàn)對開發(fā)方法的研究,、軟件管理的規(guī)范,、體系結(jié)構(gòu)的分離[12]。在開發(fā)信息系統(tǒng)軟件過程中,,通常會將一個(gè)系統(tǒng)分為幾個(gè)相互獨(dú)立的功能模塊,,由不同人員來開發(fā),最后再根據(jù)用戶的操作邏輯和業(yè)務(wù)邏輯組織起來,。通過對插件虛擬機(jī)的研究,,實(shí)現(xiàn)了縮減業(yè)務(wù)邏輯部分代碼,,首次提出用配置文件的描述語言代替業(yè)務(wù)邏輯部分的代碼;其次,,以“插件”的形式來實(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的訪問控制策略合成研究[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)程的通用平臺第二版[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].中國信息界,,2012(11):56-59.