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