趙媛,周立軍,宦婧
(海軍航空工程學(xué)院 基礎(chǔ)實驗部,山東 煙臺 264001)
基于LC-WS的遺留代碼重用
趙媛,周立軍,宦婧
(海軍航空工程學(xué)院 基礎(chǔ)實驗部,山東 煙臺264001)
針對目前存在的大量遺留代碼,提出基于LC-WS將遺留代碼進行包裝、部署并且重用。通過Web Services的方式提供給訪問者調(diào)用。采用LC-WS的方法,只需要付出低廉的代價就可以實現(xiàn)大量遺留代碼在信息集成平臺中的重新利用,既可以縮短開發(fā)周期,還可以降低開發(fā)風(fēng)險。通過在已搭建信息集成平臺中的實際應(yīng)用,證明這一方法是可行的。
遺留代碼;Web Service;JNI;重用
目前各領(lǐng)域仍存在著大量的應(yīng)用程序是采用傳統(tǒng)語言編寫的,它們不能直接在新系統(tǒng)中應(yīng)用,但是仍然有很大的利用價值,這些應(yīng)用程序代碼就被稱為LC(遺留代碼,Legacy Code)[1]。在已搭建并投入使用的信息集成平臺中,將這些LC 以 WS(Web Services)的方式進行重用,正是本文的研究重點。
1.1基于WebService的系統(tǒng)架構(gòu)
Web Service是一種開放的分布式應(yīng)用程序模型,使用它可以獨立于平臺,通過標(biāo)準(zhǔn)的Web協(xié)議,建立可以由應(yīng)用程序通過網(wǎng)絡(luò)訪問的應(yīng)用程序邏輯單元[2]。有關(guān)組織已經(jīng)發(fā)布了一些實現(xiàn) Web Service所需要的協(xié)議和標(biāo)準(zhǔn),如 Soap,WSDL,UDDI等。Web Service的目的是將信息和服務(wù)在Internet上實現(xiàn)提供和訪問,實現(xiàn)跨平臺的互操作性[3]。
Web Service的基本結(jié)構(gòu)是基于服務(wù)提供者、服務(wù)請求者和中介者3個角色,以及服務(wù)的發(fā)布、發(fā)現(xiàn)和服務(wù)請求者與服務(wù)提供者之間的綁定3個動作而定義的,而Web Services就是部署在提供者服務(wù)器上的具體服務(wù)。Web Services建立后,任何語言,任何平臺上的用戶都可以閱讀其WSDL文檔,以調(diào)用這個Services[4]。
文中基于Web Services所構(gòu)建的系統(tǒng),由信息注冊中心、信息提供方、信息請求方三者組成,如圖1所示。信息提供方首先要在信息注冊中心發(fā)布信息,并將要發(fā)布的信息的元信息寫入本地注冊表;信息請求方在信息注冊中心查找自己需要的信息,得到感興趣的具體信息(例如具體的url等細(xì)節(jié)信息);信息請求方根據(jù)在信息注冊中心獲得的信息細(xì)節(jié)填寫基于JSP技術(shù)的信息查詢系統(tǒng)頁面,訪問信息提供方的信息共享服務(wù);信息提供方接收到信息請求方的信息請求時,從遠(yuǎn)程的底層異構(gòu)數(shù)據(jù)庫中,抽取信息進行包裝,包裝成XML信息格式;信息提供方將包裝后的XML標(biāo)準(zhǔn)格式的信息返回給信息請求方;信息請求方將訪問得到的信息保存為本地XML文檔文件,命名為后綴為.xml的文件,最后基于瀏覽器采用JDOM進行解析。
圖1 系統(tǒng)架構(gòu)圖
1.2JNI技術(shù)
JNI,即Java Native Interface屬于JDK的一部分,已經(jīng)被集成到標(biāo)準(zhǔn)Java平臺之中,通過使用JNI編寫程序,可以讓代碼方便地實現(xiàn)跨平臺特性。JNI允許運行在Java虛擬機上的Java代碼操作其他語言編寫的應(yīng)用程序和庫[5]。使用JNI提供的方法,Java代碼能夠直接與特定操作系統(tǒng)和硬件平臺中的二進制庫進行交互。這個交互過程發(fā)生在相同的Java虛擬機進程之中,使得來自Java類并被標(biāo)志為“本地”的Java方法的調(diào)用能夠被映射到共享二進制庫中的相應(yīng)函數(shù)上,并且將這兩者加載到相同的進程中[6]。
JNI使得本地方法使用Java對象的方式就和Java代碼使用這些對象一樣,能夠調(diào)用現(xiàn)有的Java方法,傳遞該方法所需的參數(shù)[7],得到返回的結(jié)果。
JNI技術(shù)中基本類型與本地類型的對應(yīng)關(guān)系如圖2所示。
圖2 類型對應(yīng)關(guān)系
基于LC-WS的遺留代碼服務(wù)化,整個過程包括:遺留代碼的預(yù)處理、Wrapper包裝、動態(tài)鏈接庫的生成,legcode服務(wù)調(diào)用。
LC-WS方法將分析后的 legcode通過JNI技術(shù)進行包裝,生成.dll文件,然后部署成服務(wù)等待調(diào)用,工作原理如圖3所示。其中a.dll和b.dll是采用JNI對遺留代碼包裝后生成的。
圖3 LC-WS工作原理
采用Java class來編寫legcode services,通過調(diào)用一個中間介質(zhì)類(如a.java)來實現(xiàn)對于動態(tài)鏈接庫的調(diào)用。關(guān)鍵代碼如下:
將遺留代碼通過JNI包裝成Web服務(wù)的LC-WS方法包括以下幾個步驟:
1)編寫legcode類,部署成Web服務(wù),如圖4所示。
在各種services的調(diào)用過程中,Legcode是主類,每當(dāng)一種遺留代碼被包裝和發(fā)布以后,才對增加其相對應(yīng)的方法。
圖4 遺留代碼部署為服務(wù)
2)進行代碼分析以及預(yù)處理,編寫對應(yīng)的Java類,要求在編寫的類中必須要包含具體的本地方法的調(diào)用細(xì)節(jié)。
分析遺留代碼是編寫本地代碼的前提,在遺留代碼預(yù)處理階段,通過程序切片技術(shù),對遺留代碼進行簡化,使其結(jié)構(gòu)清晰。而且本地方法的編寫和一般的Java方法不同,本地方法的聲明必須包含標(biāo)識符native,以表示此方法是用另一種語言實現(xiàn)的。
3)JNI包裝遺留代碼,具體包括:
①通過javac命令編譯步驟2)中生成的Java類。
②生成.h的頭文件,而且頭文件中必須要包括所部署方法的函數(shù)聲明。
③編寫本地方法的C語言實現(xiàn)。
④編譯本地C函數(shù),生成本地鏈接庫。
4)在legacode類中編寫方法,調(diào)用步驟2)中生成的java類。
LC-WS方法將面向集中式系統(tǒng)的、無法集成到現(xiàn)有平臺中的遺留代碼成功的集成到基于Web服務(wù)的網(wǎng)絡(luò)系統(tǒng)中。在已經(jīng)發(fā)布的legcode service中,增加更新動態(tài)鏈接庫的功能,這樣就可以避免多次發(fā)布的繁瑣[8]。使用LC-WS方法轉(zhuǎn)化遺留代碼成為Web服務(wù),本地注冊者只需要對C語言有初級了解即可。但是本文所研究的LC-WS方法只適合有返回值的C代碼,對于遺留代碼沒有返回值的C函數(shù),需要進一步的研究。
[1]Kacsuk P,Goyeneche A,Delaitre T,et al.High-level grid application environment to use legacy codes as OGSA grid services[C]//Proceedings of Fifth IEEE/ACM International Workshop on Grid Computing(GRID’04),Hawaii:IEEE,2004:179-180.
[2]臧文科,楊杰,韓秀萍.基于Web Service的繼續(xù)教育管理系統(tǒng)設(shè)計與實現(xiàn) [J].計算機應(yīng)用與軟件,2010,27(11): 102-104.
[3]代田田,陳洪亮,張峰.跨平臺分布式Web服務(wù)的自動路由[J].實驗室研究與探索,2007,26(7):64-66.
[4]Shantanu Bhattacharya.將遺留系統(tǒng)集成到您的SOA中[EB/ OL].(2008-03)http://www.ibm.com/developerworks/cn/web services/ws-soa-legacyapps/index.html,.
[5]SHENG Liang.The JAva native interface programmer’s guide and specification[S].Sun Microsystems,1999.
[6]Huang Y,Taylor I,Walkep D,et al.Wrapping codes for grid-based applications[J].Fromce,2003,17(5):139-145.
[7]鄒燕飛,趙媛.分布式環(huán)境下遺留代碼重用研究 [J].自動化技術(shù)與應(yīng)用,2009,28(10):49-51.
[8]鄒燕飛.遺留代碼在企業(yè)信息網(wǎng)格中重用的研究 [D].甘肅:西北師范大學(xué),2007.
Reusing the legacy code based on the method of LC-WS
ZHAO Yuan,ZHOU Li-jun,HUAN Jing
(Department of Basic Experiment,Naval Aeronautical and Astronautical University,Yantai 264001,China)
There are lots of legacy code in the old system,a new method LC-WS to reuse the legacy code is presented in this paper.The legacy code is wrapped and published into services which can be accessed by service invoker.By the method of LC-WS,a lot of legacy code can be reused at lower cost.The obtained result not only can shorten the research period,but also can lower exploitation risk.Experiments have proven the method is feasible.
legacy code;Web Service;JNI;reusage
TN919
A
1674-6236(2016)14-0012-02
2015-08-04稿件編號:201508014
海軍航空工程學(xué)院基礎(chǔ)研究基金(HYJC201322)
趙 媛(1983—),女,山東沂水人,碩士,工程師。研究方向:計算機教學(xué)、分布式計算。