欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)及方法

文檔序號(hào):7698253閱讀:184來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)及方法
技術(shù)領(lǐng)域
本發(fā)明涉及一種業(yè)務(wù)加載的方法,尤其涉及一種業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)及
方法。
背景技術(shù)
目前的業(yè)務(wù)系統(tǒng)均是根據(jù)用戶(hù)的需求而設(shè)計(jì)的,業(yè)務(wù)系統(tǒng)為用戶(hù)提供了各種各樣 的業(yè)務(wù)服務(wù),這大大方便了用戶(hù)對(duì)業(yè)務(wù)系統(tǒng)的應(yīng)用。隨著技術(shù)的進(jìn)步、環(huán)境的變化,對(duì)于任 一客戶(hù)群而言,其需求也總是變化的。為滿(mǎn)足用戶(hù)需求,即使是同一業(yè)務(wù),經(jīng)常進(jìn)行更新也 是必要的。這里所指的業(yè)務(wù)系統(tǒng),是指各種具體的應(yīng)用系統(tǒng),特別是網(wǎng)絡(luò)上的服務(wù)器端的應(yīng) 用系統(tǒng),支持相關(guān)業(yè)務(wù)的應(yīng)用系統(tǒng)等。業(yè)務(wù)更新包括業(yè)務(wù)升級(jí)、業(yè)務(wù)擴(kuò)展、新增業(yè)務(wù)等。例如 目前的電信業(yè)務(wù)系統(tǒng)中,除了一些正常的電信業(yè)務(wù)外,運(yùn)營(yíng)商針對(duì)用戶(hù)的需求,還推出有相 關(guān)的增值業(yè)務(wù)如電話(huà)聲訊業(yè)務(wù)、服務(wù)查詢(xún)業(yè)務(wù)、網(wǎng)絡(luò)服務(wù)等。對(duì)于運(yùn)營(yíng)商來(lái)說(shuō),增值服務(wù)的 推出或更新一般能拓展其收入,運(yùn)營(yíng)商樂(lè)意進(jìn)行業(yè)務(wù)升級(jí)的操作,但對(duì)于業(yè)務(wù)系統(tǒng)而言,升 級(jí)操作往往需要服務(wù)器重新啟動(dòng),這必然導(dǎo)致所有的業(yè)務(wù)中斷,將對(duì)運(yùn)營(yíng)商造成收入損失, 同時(shí)對(duì)用戶(hù)而言也會(huì)因服務(wù)中斷而導(dǎo)致不必要的損失,為降低運(yùn)營(yíng)損失及避免給用戶(hù)帶來(lái) 服務(wù)上的不便,電信業(yè)務(wù)的升級(jí)是相當(dāng)謹(jǐn)慎的,不得不升級(jí)的操作往往選擇在凌晨使用用 戶(hù)較少的時(shí)候,即便如此,中斷業(yè)務(wù)的損失也是相當(dāng)大,這對(duì)于業(yè)務(wù)系統(tǒng)的用戶(hù)特別是運(yùn)營(yíng) 商級(jí)的用戶(hù)而言,是相當(dāng)棘手的一對(duì)矛盾。針對(duì)于此,目前常用的技術(shù)手段多是采用冗余備 份的方式,即同時(shí)配備兩套系統(tǒng),當(dāng)需要升級(jí)更新時(shí),在冗余系統(tǒng)上進(jìn)行更新,而當(dāng)更新完 畢后,用冗余設(shè)備替換當(dāng)前使用的設(shè)備。這種方式雖然能大大縮短中斷的時(shí)間,但更換設(shè)備 時(shí)還是得中斷所有的業(yè)務(wù),如果操作不熟練,比更新設(shè)備花費(fèi)的時(shí)間還要長(zhǎng)。能直接在業(yè) 務(wù)系統(tǒng)運(yùn)行的設(shè)備上進(jìn)行業(yè)務(wù)加載而不必重啟系統(tǒng),是當(dāng)前業(yè)務(wù)系統(tǒng)用戶(hù)所渴望解決的問(wèn) 題。

發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)及方 法,能在不停止系統(tǒng)業(yè)務(wù)的情況下實(shí)現(xiàn)新增或更新業(yè)務(wù)的加載,加載完畢后不必重啟業(yè)務(wù) 系統(tǒng)。 為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的 —種業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載的方法,在所述業(yè)務(wù)系統(tǒng)中指定新增及更新業(yè)務(wù)存 放的文件夾,對(duì)配置新增JAVA類(lèi)文件及更新JAVA類(lèi)文件的配置文件進(jìn)行初始化配置,并設(shè) 置監(jiān)控所述文件夾中設(shè)定的JAVA類(lèi)文件更新?tīng)顩r的線(xiàn)程;根據(jù)用戶(hù)需求確定所述業(yè)務(wù)系 統(tǒng)的新增業(yè)務(wù)或/和更新業(yè)務(wù),在所述業(yè)務(wù)系統(tǒng)的開(kāi)發(fā)環(huán)境下編譯所述新增業(yè)務(wù)或/和更 新業(yè)務(wù)的應(yīng)用,對(duì)所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用進(jìn)行調(diào)試,調(diào)試成功后將所述新增 業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用對(duì)應(yīng)的JAVA源文件生成JAVA類(lèi)文件;所述方法包括以下步驟
A、將所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用的JAVA類(lèi)文件存儲(chǔ)于所述業(yè)務(wù)新增及
4更新指定的文件夾中,參照配置模板編寫(xiě)新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA類(lèi)文件的配置指令,從而實(shí)現(xiàn)配置文件的編寫(xiě),并用新編寫(xiě)完成的配置文件直接覆蓋舊的配置文件;所述配置文件分為兩個(gè), 一個(gè)是監(jiān)控新增文件的配置文件, 一個(gè)是完成更新映射的配置文件;
B、所述線(xiàn)程監(jiān)控文件夾中設(shè)定種類(lèi)的JAVA類(lèi)文件的實(shí)時(shí)新增和更新?tīng)顩r,在有新的JAVA類(lèi)文件導(dǎo)入時(shí),提取新的JAVA類(lèi)文件,存儲(chǔ)到業(yè)務(wù)系統(tǒng)所在的內(nèi)存中;
C、接收到用戶(hù)的業(yè)務(wù)請(qǐng)求后,業(yè)務(wù)系統(tǒng)獲取系統(tǒng)的配置文件并自動(dòng)進(jìn)行解析,根據(jù)所述配置文件調(diào)用業(yè)務(wù)系統(tǒng)所在的內(nèi)存中相應(yīng)的JAVA類(lèi)文件,在業(yè)務(wù)系統(tǒng)的執(zhí)行環(huán)境下,JAVA類(lèi)文件按其自身的邏輯被執(zhí)行,將JAVA類(lèi)文件的執(zhí)行結(jié)果提供至用戶(hù),使用戶(hù)獲得業(yè)務(wù)支持;其中,被執(zhí)行的JAVA類(lèi)文件包括新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA類(lèi)文件。
其中,所述步驟B中提取所述新的JAVA類(lèi)文件存儲(chǔ)到所述業(yè)務(wù)系統(tǒng)所在的內(nèi)存中,具體為通過(guò)解析監(jiān)控新增文件的配置文件中配置的路徑名自動(dòng)發(fā)現(xiàn)該路徑下的新增JAVA類(lèi)文件,并通過(guò)類(lèi)加載器將其加載到業(yè)務(wù)系統(tǒng)所在的內(nèi)存中。 其中,所述設(shè)置所述JAVA類(lèi)文件新增到所述業(yè)務(wù)系統(tǒng)中的配置模板,具體為根據(jù)所述JAVA類(lèi)文件的路徑、存儲(chǔ)地址的信息建立所述JAVA類(lèi)文件發(fā)現(xiàn)的模板,將新增JAVA類(lèi)文件所在的路徑或存儲(chǔ)地址信息替換所述模板中的路徑、存儲(chǔ)地址信息,即編寫(xiě)所述新增JAVA類(lèi)文件的配置文件;設(shè)置所述JAVA類(lèi)文件替換所述業(yè)務(wù)系統(tǒng)中原JAVA類(lèi)文件的配置模板,具體為根據(jù)所述JAVA類(lèi)文件的名稱(chēng)、存儲(chǔ)地址的信息建立欲更新的JAVA類(lèi)文件的調(diào)用及阻止待替換的JAVA類(lèi)文件調(diào)用的應(yīng)用的模板,將更新JAVA類(lèi)文件及待更新JAVA類(lèi)文件的名稱(chēng)或存儲(chǔ)地址分別替換所述應(yīng)用的模板中的更新JAVA類(lèi)文件及待更新JAVA類(lèi)文件的名稱(chēng)、存儲(chǔ)地址,即編寫(xiě)所述更新JAVA類(lèi)文件的配置文件。 其中,所述步驟A中用新編寫(xiě)完成的配置文件直接覆蓋舊的配置文件,具體為將編寫(xiě)好的已測(cè)試成功的配置文件覆蓋掉原先的配置文件,以避免直接進(jìn)行配置而導(dǎo)致配置中出現(xiàn)異常。 其中,所述業(yè)務(wù)系統(tǒng)為JAVA支持的業(yè)務(wù)系統(tǒng),所述業(yè)務(wù)包括各種Web服務(wù)業(yè)務(wù)、電信服務(wù)業(yè)務(wù)、基于各種操作系統(tǒng)的服務(wù)業(yè)務(wù)。 其中,所述步驟B中提取所述新的JAVA類(lèi)文件存儲(chǔ)到所述業(yè)務(wù)系統(tǒng)所在的內(nèi)存中,具體為查找具有設(shè)定名稱(chēng)的類(lèi)或所述類(lèi)的接口的二進(jìn)制表示,構(gòu)造供JAVA虛擬機(jī)的執(zhí)行引擎引用和解釋執(zhí)行的與所述類(lèi)或類(lèi)的接口對(duì)應(yīng)的內(nèi)存結(jié)構(gòu)。
—種業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng),包括 設(shè)置單元,用于在所述業(yè)務(wù)系統(tǒng)中設(shè)置新增及更新業(yè)務(wù)指定的文件夾; 線(xiàn)程監(jiān)控單元,用于監(jiān)控配置文件的改變及所述文件夾中JAVA類(lèi)文件的新增和
更新?tīng)顩r; JAVA類(lèi)文件生成單元,用于根據(jù)用戶(hù)需求確定所述業(yè)務(wù)系統(tǒng)的新增業(yè)務(wù)或/和更新業(yè)務(wù),在所述業(yè)務(wù)系統(tǒng)的開(kāi)發(fā)環(huán)境下編譯所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用,對(duì)所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用進(jìn)行調(diào)試,調(diào)試成功后生成所述新增業(yè)務(wù)或/和更新業(yè)務(wù)相應(yīng)JAVA類(lèi)文件;將所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用的JAVA類(lèi)文件存儲(chǔ)于所述業(yè)務(wù)新增及更新指定的文件夾中; 配置模板設(shè)置單元,參照配置模板編寫(xiě)新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA類(lèi)文件的配置指令完成配置文件的編寫(xiě),并用新編寫(xiě)完成的配置文件直接覆蓋舊的配置文件;
JAVA類(lèi)文件新增及更新單元,在所述線(xiàn)程監(jiān)控單元監(jiān)控到所述文件夾中有設(shè)定種類(lèi)的新的JAVA類(lèi)文件導(dǎo)入時(shí),提取所述新的JAVA類(lèi)文件,存儲(chǔ)到所述業(yè)務(wù)系統(tǒng)所在的內(nèi)存中;
執(zhí)行單元,接收到用戶(hù)的業(yè)務(wù)請(qǐng)求后,業(yè)務(wù)系統(tǒng)獲取系統(tǒng)的配置文件并自動(dòng)進(jìn)行解析,根據(jù)配置文件調(diào)用業(yè)務(wù)系統(tǒng)所在的內(nèi)存中相應(yīng)的JAVA類(lèi)文件,在業(yè)務(wù)系統(tǒng)的執(zhí)行環(huán)境下,JAVA類(lèi)文件按其自身的邏輯被執(zhí)行,將JAVA類(lèi)文件的執(zhí)行結(jié)果提供至用戶(hù),使用戶(hù)獲得業(yè)務(wù)支持;其中,被執(zhí)行的JAVA類(lèi)文件包括新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA類(lèi)文件。
其中,所述業(yè)務(wù)系統(tǒng)為JAVA支持的業(yè)務(wù)系統(tǒng),所述業(yè)務(wù)包括各種Web服務(wù)業(yè)務(wù)、電信服務(wù)業(yè)務(wù)、基于各種操作系統(tǒng)的服務(wù)業(yè)務(wù)。 本發(fā)明在為業(yè)務(wù)系統(tǒng)加載新業(yè)務(wù)或進(jìn)行業(yè)務(wù)更新時(shí),將所編譯的業(yè)務(wù)應(yīng)用生成的
文件導(dǎo)入到事先指定的文件夾中,同時(shí)初始化設(shè)置待加載文件的配置文件,將描述所述配
置文件的配置文件存放到業(yè)務(wù)系統(tǒng)中,同時(shí)設(shè)置監(jiān)控文件夾中設(shè)定的文件的變更情況的線(xiàn)
程,運(yùn)行所述業(yè)務(wù)系統(tǒng)時(shí),線(xiàn)程監(jiān)控所設(shè)置文件夾中設(shè)定的文件的變更情況,當(dāng)有新的文件
導(dǎo)入時(shí),提取所述文件并存儲(chǔ)到業(yè)務(wù)系統(tǒng)所在的內(nèi)存中,業(yè)務(wù)系統(tǒng)進(jìn)行業(yè)務(wù)提供時(shí),根據(jù)各
業(yè)務(wù)的配置文件調(diào)用業(yè)務(wù)系統(tǒng)所在的內(nèi)存中的業(yè)務(wù)文件,解析所述文件并執(zhí)行之,從而完
成業(yè)務(wù)系統(tǒng)中的業(yè)務(wù)支持。在業(yè)務(wù)文件導(dǎo)入業(yè)務(wù)系統(tǒng)后,所設(shè)置的線(xiàn)程即刻將其導(dǎo)入到業(yè)
務(wù)系統(tǒng)所在的內(nèi)存中,業(yè)務(wù)系統(tǒng)根據(jù)所述業(yè)務(wù)的配置文件查找內(nèi)存中存儲(chǔ)的業(yè)務(wù)文件,通
過(guò)對(duì)其解析并執(zhí)行而實(shí)現(xiàn)其業(yè)務(wù)。這樣,無(wú)論導(dǎo)入多少業(yè)務(wù)文件,只要該文件的編譯沒(méi)有問(wèn)
題,均可直接獲得執(zhí)行,從而不必重新啟動(dòng)業(yè)務(wù)系統(tǒng)即可實(shí)現(xiàn)業(yè)務(wù)的加載。本發(fā)明在不重啟
系統(tǒng)的情況下實(shí)現(xiàn)了業(yè)務(wù)的加載。本發(fā)明的技術(shù)方案實(shí)現(xiàn)簡(jiǎn)單,加載業(yè)務(wù)后可以不重啟業(yè)
務(wù)系統(tǒng),從而在業(yè)務(wù)系統(tǒng)不中斷業(yè)務(wù)的情況下實(shí)現(xiàn)了業(yè)務(wù)加載,對(duì)于如電信運(yùn)營(yíng)系統(tǒng)而言,
大大降低了其業(yè)務(wù)加載所受的損失,同時(shí)也避免了這些業(yè)務(wù)系統(tǒng)的普通用戶(hù)因業(yè)務(wù)中斷所
造成的損失。


圖1為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載的方法的流程圖; 圖2為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)的結(jié)構(gòu)示意圖; 圖3為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)中各單元核心模塊邏輯結(jié)
構(gòu)示意圖; 圖4為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)中配置文件監(jiān)控模塊的實(shí)現(xiàn)結(jié)構(gòu)示意圖; 圖5為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)中新增及更新JAVA類(lèi)文件監(jiān)控模塊的實(shí)現(xiàn)結(jié)構(gòu)示意圖; 圖6為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)中新增及更新文件注冊(cè)加載模塊的實(shí)現(xiàn)結(jié)構(gòu)示意圖; 圖7為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)中配置文件解析模塊的實(shí)現(xiàn)結(jié)構(gòu)示意圖。
具體實(shí)施例方式
以下結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)描述。
圖l為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載的方法的流程圖,如圖l所示,本發(fā)明業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載的方法包括以下步驟 步驟101 :指定新增文件及更新文件所需存放的文件夾,對(duì)配置新增JAVA類(lèi)文件及更新JAVA類(lèi)文件的配置文件進(jìn)行初始化配置,在業(yè)務(wù)系統(tǒng)中設(shè)置監(jiān)控文件夾中設(shè)定的JAVA類(lèi)文件新增和更新?tīng)顩r的線(xiàn)程;根據(jù)用戶(hù)需求確定業(yè)務(wù)系統(tǒng)的新增業(yè)務(wù)或/和更新業(yè)務(wù),在業(yè)務(wù)系統(tǒng)的開(kāi)發(fā)環(huán)境下編譯新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用,對(duì)新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用進(jìn)行調(diào)試,調(diào)試成功后新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用對(duì)應(yīng)的類(lèi)生成相應(yīng)的JAVA類(lèi)文件。 這里,業(yè)務(wù)系統(tǒng)即是支持各種業(yè)務(wù)的應(yīng)用系統(tǒng),如電信運(yùn)營(yíng)系統(tǒng)、會(huì)員管理信息系統(tǒng)、Web服務(wù)系統(tǒng)、各種服務(wù)器上裝載的服務(wù)業(yè)務(wù)等,這些業(yè)務(wù)系統(tǒng)均是通過(guò)JAVA語(yǔ)言開(kāi)發(fā)實(shí)現(xiàn)的。由于業(yè)務(wù)的編譯不是本發(fā)明的重點(diǎn),各種語(yǔ)言所執(zhí)行的邏輯運(yùn)算及編譯理論基本相同,這里不再對(duì)業(yè)務(wù)系統(tǒng)作更多描述。 所述的文件夾根據(jù)業(yè)務(wù)系統(tǒng)中新增和更新的情況進(jìn)行設(shè)定,以系統(tǒng)開(kāi)發(fā)的邏輯結(jié)構(gòu)為主要方向在配置文件中進(jìn)行相應(yīng)的配置即可,以JAVA語(yǔ)言的業(yè)務(wù)系統(tǒng)為例,解釋一下JAVA類(lèi)文件。在JAVA業(yè)務(wù)系統(tǒng)的標(biāo)準(zhǔn)實(shí)現(xiàn)中,JAVA編譯器為每個(gè)JAVA類(lèi)(業(yè)務(wù))生成一個(gè)JAVA類(lèi)文件,這種文件采用JAVA虛擬機(jī)(JVM)定義的JAVA類(lèi)文件格式保存,并由JAVA虛擬機(jī)加載并解釋執(zhí)行。針對(duì)當(dāng)前的業(yè)務(wù)系統(tǒng),系統(tǒng)維護(hù)人員確定要加載或更新的業(yè)務(wù),根據(jù)業(yè)務(wù)所需的功能,進(jìn)行相應(yīng)的開(kāi)發(fā)即編譯支持所述業(yè)務(wù)的應(yīng)用,編譯調(diào)試完畢后,通過(guò)JAVA編譯器或類(lèi)似的語(yǔ)言編譯器將所述業(yè)務(wù)的應(yīng)用生成相應(yīng)的JAVA類(lèi)文件。需要說(shuō)明的是,JAVA類(lèi)文件是一個(gè)格式文件,并不受編譯環(huán)境的限制,任何JAVA編譯環(huán)境均可生成相應(yīng)的JAVA類(lèi)文件。 設(shè)置JAVA類(lèi)文件新增到業(yè)務(wù)系統(tǒng)中的配置模板根據(jù)所述JAVA類(lèi)文件的路徑、存儲(chǔ)地址的信息建立所述JAVA類(lèi)文件發(fā)現(xiàn)的模板,將新增JAVA類(lèi)文件所在的路徑或存儲(chǔ)地址信息替換所述模板中的路徑、存儲(chǔ)地址信息,即編寫(xiě)所述新增JAVA類(lèi)文件的配置文件;設(shè)置所述JAVA類(lèi)文件替換所述業(yè)務(wù)系統(tǒng)中原JAVA類(lèi)文件的配置模板,具體為根據(jù)所述JAVA類(lèi)文件的名稱(chēng)、存儲(chǔ)地址的信息建立欲更新的JAVA類(lèi)文件的調(diào)用及阻止待替換的JAVA類(lèi)文件調(diào)用的應(yīng)用的模板,將更新JAVA類(lèi)文件及待更新JAVA類(lèi)文件的名稱(chēng)或存儲(chǔ)地址分別替換所述應(yīng)用的模板中的更新JAVA類(lèi)文件及待更新JAVA類(lèi)文件的名稱(chēng)、存儲(chǔ)地址,即編寫(xiě)所述更新JAVA類(lèi)文件的配置文件。 這里所述替換并不是通常的將新文件覆蓋舊文件,而是指在一段時(shí)間內(nèi),兩個(gè)文
件同時(shí)存在,更新時(shí),只是在邏輯上進(jìn)行替換即程序調(diào)用新文件而不調(diào)用舊文件,進(jìn)而完成
替換。當(dāng)功能更新完成后,之后登錄的用戶(hù)訪問(wèn)的是新功能。而更新之前已經(jīng)進(jìn)行訪問(wèn)的
用戶(hù)訪問(wèn)的仍然是舊功能,但是在業(yè)務(wù)中端后的下一次訪問(wèn)的便是新功能,這也正是更新
系統(tǒng)不影響已登錄用戶(hù)訪問(wèn)舊功能,新登錄用戶(hù)訪問(wèn)新功能的原理所在。所述JAVA類(lèi)文件
替換所述業(yè)務(wù)系統(tǒng)中原JAVA類(lèi)文件的配置模板如下 以網(wǎng)頁(yè)所支持業(yè)務(wù)為例,在updatedes. xml文件配置如下 〈update> 〈classdir> 〈imload>cn. bupt. pj. add. Jcorm〈/imload>
7
〈reload>cn. bupt. pj. add. NewJcorm〈/reload> 〈/classdir>
〈/update> 其中,cn. b卯t. pj. add. Jco皿為被更新的類(lèi);cn. bupt. pj. add. Newjco皿為更新類(lèi)。 以會(huì)員管理系統(tǒng)中的投票業(yè)務(wù)的更新為例,在沒(méi)有使用本系統(tǒng)之前,業(yè)務(wù)程序初始化一個(gè)業(yè)務(wù)JAVA類(lèi)文件的對(duì)象和進(jìn)行這個(gè)類(lèi)方法的配置文件(程序一)為
1. ChartService chartServ = New ChartService (); 2. String file謹(jǐn)e = chartServ. ge證atorPieChart ( 〃會(huì)員滿(mǎn)意度投票結(jié)果〃 ,session, request, new PrintWriter (out)); 上面程序中第一條語(yǔ)句是初始化一個(gè)ChartService類(lèi)的對(duì)象,第二條語(yǔ)句是該對(duì)象調(diào)用ChartService類(lèi)中的generatorPieChart方法,("會(huì)員滿(mǎn)意度投票結(jié)果〃 ,session, request, new PrintWriter (out))里的內(nèi)容為該方法的參數(shù)。該方式只使用于對(duì)ChartService這個(gè)類(lèi)的使用,故無(wú)法實(shí)現(xiàn)新舊功能類(lèi)之間的切換。 本發(fā)明的業(yè)務(wù)程序時(shí)初始化一個(gè)業(yè)務(wù)JAVA類(lèi)文件的對(duì)象和進(jìn)行這個(gè)類(lèi)方法的配置文件(程序二)為 1. Init init = new Init();〃系統(tǒng)提供的一個(gè)類(lèi)對(duì)象的初始化 2. Object chartServ = init. new0bject (〃 com. jun. service.
ChartService");〃使用該函數(shù)及類(lèi)的全名字符串來(lái)進(jìn)行對(duì)象的初始化,代替new關(guān)鍵
字,該例為使用無(wú)參數(shù)構(gòu)造方法,若使用帶參數(shù)構(gòu)造方法需在其后追加兩個(gè)參數(shù),分別為參
數(shù)對(duì)象數(shù)組和參數(shù)類(lèi)型數(shù)組。 3.String filename = (String)init. InvokeMethod( 〃 generatorPieChart 〃 , chartServ,固O(píng)bject [] { 〃會(huì)員滿(mǎn)意度投票結(jié)果〃 ,session, request,new PrintWriter(out)} , newClass[] {String, class, HttpSession. class,HttpServletRequest. class, PrintWriter. class}); 〃使用該函數(shù)調(diào)用某個(gè)方法,參數(shù)依次為方法名,調(diào)用該方法的對(duì)象名,方法的參數(shù)對(duì)象數(shù)組,方法的參數(shù)類(lèi)型數(shù)組。 以上三條語(yǔ)句中第一條語(yǔ)句為使用本發(fā)明提供的配置模板對(duì)一個(gè)類(lèi)對(duì)象的初始化,用這個(gè)類(lèi)中的函數(shù)來(lái)代替原先的方式來(lái)初始化一個(gè)業(yè)務(wù)JAVA類(lèi)文件的對(duì)象和進(jìn)行這個(gè)類(lèi)方法的調(diào)用。第二條語(yǔ)句即是使用該類(lèi)對(duì)象初始化一個(gè)ChartService類(lèi)的對(duì)象,第三條語(yǔ)句即是使用該類(lèi)對(duì)象調(diào)用chartServ對(duì)象的generatorPieChart方法。
在配置文件中沒(méi)有配置對(duì)ChartService類(lèi)的更新時(shí),程序二實(shí)現(xiàn)的功能與程序一實(shí)現(xiàn)的功能完全相同,在配置文件中配置了對(duì)ChartService類(lèi)的更新時(shí),例如更新后的類(lèi)為NewChartService,程序二將執(zhí)行xml配置文件中進(jìn)行了與ChartService映射的NewChartService類(lèi),由此便實(shí)現(xiàn)了從執(zhí)行ChartService類(lèi)到NewChartService類(lèi)的切換。
設(shè)置配置模板的優(yōu)點(diǎn)是業(yè)務(wù)系統(tǒng)的維護(hù)人員只需根據(jù)模板進(jìn)行業(yè)務(wù)配置即可,本發(fā)明相當(dāng)于提供了一個(gè)動(dòng)態(tài)的接口,維護(hù)人員只需預(yù)留一個(gè)被更新的位置而無(wú)需知道將要被更新成什么樣的類(lèi),只需要在xml配置文件中進(jìn)行映射配置,系統(tǒng)便自己去解析配置文件而執(zhí)行相應(yīng)的新類(lèi)的功能。
新增JAVA類(lèi)文件的監(jiān)測(cè)線(xiàn)程可設(shè)置為周期性監(jiān)控實(shí)現(xiàn)方式,如每20分鐘對(duì)待監(jiān)測(cè)的文件夾掃描一次等。 以上只是作為示例的說(shuō)明,任何種類(lèi)的JAVA類(lèi)文件的配置模板均可參照上述示例進(jìn)行設(shè)置。 步驟102 :將新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用的JAVA類(lèi)文件存儲(chǔ)于業(yè)務(wù)新增及更
新指定的文件夾中,參照配置模板編寫(xiě)新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA類(lèi)文件的配置指令
完成配置文件的編寫(xiě),并用新的配置文件覆蓋原先的配置文件,以上所述配置文件分為兩
個(gè), 一個(gè)是監(jiān)控新增文件的配置文件, 一個(gè)是完成更新映射的配置文件。 步驟101生成業(yè)務(wù)的JAVA類(lèi)文件之后,將其導(dǎo)入到設(shè)定的文件夾中,同時(shí),根據(jù)配
置模板設(shè)置所述JAVA類(lèi)文件的配置文件。設(shè)置完配置文件后,將其覆蓋原先業(yè)務(wù)系統(tǒng)中的
配置文件。具體地,即將編寫(xiě)完成并通過(guò)測(cè)試的新的配置文件覆蓋掉舊的配置文件即可。由
于舊配置文件已被存儲(chǔ)于業(yè)務(wù)系統(tǒng)所在的內(nèi)存中,因此其所支持的舊業(yè)務(wù)仍可被用戶(hù)所調(diào)
用,但在新用戶(hù)所請(qǐng)求的該業(yè)務(wù)的新的申請(qǐng)時(shí),由于系統(tǒng)中舊配置文件已被覆蓋,因此,新
的業(yè)務(wù)申請(qǐng)的用戶(hù)將被提供更新或新增的業(yè)務(wù)。 步驟103 :線(xiàn)程監(jiān)控文件夾中設(shè)定種類(lèi)的JAVA類(lèi)文件的實(shí)時(shí)新增和更新?tīng)顩r,在有新的JAVA類(lèi)文件導(dǎo)入時(shí),提取新的JAVA類(lèi)文件,存儲(chǔ)到業(yè)務(wù)系統(tǒng)所在的內(nèi)存中。
以JAVA業(yè)務(wù)系統(tǒng)為例,說(shuō)明JAVA類(lèi)文件更新到系統(tǒng)的情況。 每一個(gè)JAVA虛擬機(jī)都由一個(gè)類(lèi)加載器子系統(tǒng)(Class Loader Subsystem),負(fù)責(zé)加載程序的JAVA類(lèi)文件。類(lèi)的裝載就是尋找一個(gè)具有特定名稱(chēng)的類(lèi)或接口的二進(jìn)制表示(即JAVA類(lèi)文件),并構(gòu)造與之對(duì)應(yīng)的內(nèi)存結(jié)構(gòu),以供JAVA虛擬機(jī)的執(zhí)行引擎引用和解釋執(zhí)行。JAVA虛擬機(jī)的動(dòng)態(tài)加載是通過(guò)JAVA系統(tǒng)類(lèi)Java. lang. ClassLoader及其子類(lèi)實(shí)現(xiàn)的。ClassLoader類(lèi)是一個(gè)抽象類(lèi),其實(shí)例或其子類(lèi)的實(shí)例被稱(chēng)為類(lèi)加載器。當(dāng)指定了一個(gè)類(lèi)名后,類(lèi)加載器會(huì)尋找相對(duì)應(yīng)的JAVA類(lèi)文件并將其加載到JAVA虛擬機(jī)環(huán)境中,同時(shí)為該類(lèi)創(chuàng)建一個(gè)對(duì)應(yīng)的類(lèi)對(duì)象。 一般情況下,JAVA虛擬機(jī)從本地文件系統(tǒng)中加載JAVA類(lèi)文件,JAVA虛擬機(jī)也允許應(yīng)用程序通過(guò)實(shí)現(xiàn)ClassLoader的子類(lèi)從網(wǎng)絡(luò)加載JAVA類(lèi)文件。
線(xiàn)程實(shí)時(shí)監(jiān)控待監(jiān)控的文件夾,當(dāng)有所設(shè)定的JAVA類(lèi)文件插入時(shí),立刻提取其相應(yīng)信息,存儲(chǔ)到業(yè)務(wù)系統(tǒng)所在的內(nèi)存中。所存儲(chǔ)到業(yè)務(wù)系統(tǒng)所在內(nèi)存中的信息,包括JAVA類(lèi)文件的名稱(chēng)、存儲(chǔ)地址、JAVA類(lèi)文件生成時(shí)間等相關(guān)屬性信息,以使業(yè)務(wù)系統(tǒng)能調(diào)用該JAVA類(lèi)文件。用于存儲(chǔ)JAVA類(lèi)文件的文件監(jiān)控線(xiàn)程(JAVA環(huán)境下)可按以下設(shè)置
假設(shè)待監(jiān)控的文件夾的路徑設(shè)置為 monitor, path = \\com\\jim\\service ;\\com\\jim\\struts\\action
monitor, pack = \\com\\jim
說(shuō)明 monitor, path為檢測(cè)新增和更新JAVA類(lèi)文件所在的目錄,多個(gè)目錄之間用分號(hào)分開(kāi),目錄須嚴(yán)格按照從應(yīng)用名的下一個(gè)目錄開(kāi)始。monitor, pack是為了從文件的路徑中截取出類(lèi)的包名,為了描述文件較好的容錯(cuò)性需為其定義規(guī)則如下JAVA類(lèi)文件所在的包應(yīng)建在三層以上,而且被檢測(cè)的所有JAVA類(lèi)文件必須至少有兩層公共目錄。
updatedes. xml配置文件 〈? xml version = ,, 1. 0" encoding = "UTF-8" >
〈update>
〈classdir> 〈imload>com. j皿.service. ChartService〈/imload> 〈reload>com. j皿.service. NewChartService〈/reload> 〈/classdir>
〈classdir>〈unload>com. jun. service. RegisterService〈/unload>
〈reload>com. jun. service. NewRegisterService〈/reload>
〈/classdir>
〈classdir>〈imload>com. j皿.service. LogonService〈/imload>
〈reload>com. j皿.service. NewLogonService〈/reload>
〈/classdir>
〈/update>
說(shuō)明 〈updateX/update〉將整個(gè)描述文件的內(nèi)容包含在里面,它可以包含多個(gè) 〈classdirX/classdir》每個(gè)〈classdirX/classdir>中表示一個(gè)更新映射,〈皿loadX/ unload〉用來(lái)顯示被更新的類(lèi),類(lèi)必須為包含包名在內(nèi)的完整類(lèi)名,〈reload〉〈/reload〉 用來(lái)顯示所有的更新后的類(lèi),類(lèi)必須為包含包名在內(nèi)的完整類(lèi)名,其必須與同一個(gè) 〈classdir〉中的〈unload〉里的類(lèi)名一一對(duì)應(yīng),以得知此類(lèi)對(duì)象為哪個(gè)類(lèi)的更新版本。
本發(fā)明中,一個(gè)類(lèi)用其完全匹配類(lèi)名作為標(biāo)識(shí),這里指的完全匹配類(lèi)名包括包名 和類(lèi)名。但在JAVA虛擬機(jī)中一個(gè)類(lèi)用其全名和一個(gè)加載類(lèi)ClassLoader的實(shí)例作為唯一 標(biāo)識(shí),不同類(lèi)加載器加載的類(lèi)將被置于不同的命名空間。 如果用同一加載器加載一個(gè)同名的JAVA文件,或者直接用更新后的文件覆蓋原 有文件,該加載器首先會(huì)檢查給類(lèi)是否被加載過(guò),如果被加載過(guò)就不再進(jìn)行加載,也就無(wú)法 被引用。這使得無(wú)法在同一個(gè)加載器下進(jìn)行源文件的更新。如果用不同的加載器來(lái)加載更 新后的文件,那么因?yàn)椴煌?lèi)加載器加載的類(lèi)將被置于不同的命名空間,這些類(lèi)之間也無(wú) 法相互訪問(wèn)。這使得無(wú)法在不同加載器下進(jìn)行源文件的更新。業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)的加載過(guò) 程是通過(guò)以下方式來(lái)實(shí)現(xiàn)的 假定系統(tǒng)原有的JAVA類(lèi)文件為A. class,要對(duì)其進(jìn)行更新,并且把修改后的更新 文件命名為B. class (B和A不相同),并將B. class放入監(jiān)控目錄下。事實(shí)上B. class和 A. class具有相同的類(lèi)結(jié)構(gòu),只是名稱(chēng)不同而已。更新時(shí),在配置文件updatedes.xml中描 述新舊功能的映射關(guān)系,這樣在更新過(guò)程結(jié)束后,當(dāng)程序調(diào)用A.class時(shí),業(yè)務(wù)動(dòng)態(tài)加載系 統(tǒng)會(huì)到updatedes. xml中查找A. class所對(duì)應(yīng)的更新類(lèi),如果沒(méi)有就直接加載A. class,否 則用當(dāng)前加載器(同一個(gè)類(lèi)加載器)加載其所對(duì)應(yīng)的B. class,這樣同一個(gè)類(lèi)加載器加載的 類(lèi)就可以相互調(diào)用,程序調(diào)用A. class時(shí),實(shí)際上調(diào)用的是B. class,這些對(duì)用戶(hù)是透明的。 系統(tǒng)由此便實(shí)現(xiàn)了在新舊業(yè)務(wù)之間的動(dòng)態(tài)切換,便實(shí)現(xiàn)了業(yè)務(wù)系統(tǒng)的動(dòng)態(tài)更新功能。
步驟104 :接收到用戶(hù)的業(yè)務(wù)請(qǐng)求后,業(yè)務(wù)系統(tǒng)獲取系統(tǒng)的配置文件并自動(dòng)進(jìn)行 解析,根據(jù)配置文件調(diào)用業(yè)務(wù)系統(tǒng)所在內(nèi)存中相應(yīng)的JAVA類(lèi)文件,在業(yè)務(wù)系統(tǒng)的執(zhí)行環(huán)境下,JAVA類(lèi)文件按其自身的邏輯被執(zhí)行,將JAVA類(lèi)文件的執(zhí)行結(jié)果提供至用戶(hù),使用戶(hù)獲 得業(yè)務(wù)支持。其中,被執(zhí)行的JAVA類(lèi)文件包括新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA類(lèi)文件。步 驟104主要用于說(shuō)明業(yè)務(wù)執(zhí)行的詳細(xì)過(guò)程,以下仍以JAVA業(yè)務(wù)系統(tǒng)為例進(jìn)行說(shuō)明。
在JAVA虛擬機(jī)規(guī)范中,加載和連接被定義為兩個(gè)相互遞歸的過(guò)程。加載是指JAVA 虛擬機(jī)根據(jù)指定的類(lèi)文件名或接口名查找相應(yīng)的JAVA類(lèi)文件,并將JAVA類(lèi)文件裝載到 運(yùn)行環(huán)境中的過(guò)程。連接是指JAVA虛擬機(jī)對(duì)JAVA類(lèi)文件進(jìn)行驗(yàn)證和解析符號(hào)引用的過(guò) 程。JAVA虛擬機(jī)通過(guò)JAVA系統(tǒng)的類(lèi)Java. lang. ClassLoader及其子類(lèi)實(shí)現(xiàn)這一加載過(guò)程。 ClassLoader類(lèi)是一個(gè)抽象類(lèi),其實(shí)例或其子類(lèi)的實(shí)例被稱(chēng)為類(lèi)加載器。當(dāng)指定了一個(gè)類(lèi)名 后,類(lèi)加載器會(huì)尋找相對(duì)應(yīng)的JAVA類(lèi)文件并將其加載到JAVA虛擬機(jī)環(huán)境中,同時(shí)為該類(lèi)創(chuàng) 建一個(gè)對(duì)應(yīng)的類(lèi)對(duì)象。 一般情況下,JAVA虛擬機(jī)從本地文件系統(tǒng)中加載JAVA類(lèi)文件,JAVA 虛擬機(jī)也允許應(yīng)用程序通過(guò)實(shí)現(xiàn)ClassLoader的子類(lèi)從網(wǎng)絡(luò)加載JAVA類(lèi)文件。在JAVA平 臺(tái)中,所有類(lèi)都是由類(lèi)加載器加載的。JAVA中的類(lèi)加載器可以分為四類(lèi)
1. Bootstrp loader Bootstrp加載器是用C++語(yǔ)言寫(xiě)的,它是在JAVA虛擬機(jī)啟動(dòng)后初始化的,它主要 負(fù)責(zé)加載% JAVA_H0ME% /jre/lib以及% JAVA_H0ME% /jre/classes中的類(lèi)。
2. ExtClassLoader Bootstrp loader力口載ExtClassLoader,并且將ExtClassLoader的父力口載器設(shè)置 為Bootstrp loader. ExtClassLoader主要力口載% JAVA—HOME % /jre/lib/ext中的jar文 檔,以及此路徑下的所有classes目錄。
3. AppClassLoader Bootstrp loader力口載完ExtClassLoader后,就會(huì)力口載AppClassLoader,并且 將AppClassLoader的父力口載器指定為ExtClassLoader。 AppClassLoader主要負(fù)責(zé)力口載 classpath所指定的位置的類(lèi)或者是jar文檔。
4.亂Classlxiader URLClassLoader是可以自定義的加載器,可以通過(guò)指定一個(gè)URL對(duì)象來(lái)創(chuàng)建此加 載器,它所加載路徑就是URL所代表的邏輯位置。并且它的父加載器是A卯ClassLoader。 很多時(shí)候都是通過(guò)類(lèi)加載器來(lái)控制JAVA虛擬機(jī)中的類(lèi)加載行為。 JAVA虛擬機(jī)的類(lèi)加載機(jī)制采用委托模型。所謂委托模型就是指當(dāng)一個(gè)加載器 在加載某個(gè)類(lèi)的時(shí)候先讓父加載器去加載,父加載器再讓其父加載器加載,依此類(lèi)推,如果 所有的父加載器都不能加載,再由自己來(lái)加載,而如果此時(shí)自己也不能加載,則產(chǎn)生Java, lang. NoClassDefFoundError錯(cuò)誤。委托模型最大的好處就是提高了 JAVA的安全性,比如 如果加載器的父加載器已經(jīng)加載了某個(gè)類(lèi),那么自己就不能再加載此類(lèi)了,這樣就使得一 些與JAVA類(lèi)庫(kù)中同名的類(lèi)不能加載進(jìn)來(lái)。 需要說(shuō)明的是,業(yè)務(wù)系統(tǒng)實(shí)現(xiàn)新業(yè)務(wù)的更新工作之后,新接入用戶(hù)訪問(wèn)的是新功 能,一直未退出的已接入用戶(hù)使用的仍然是舊功能。兩種用戶(hù)之間均可獲得相應(yīng)的業(yè)務(wù)支 持,并互不影響,當(dāng)已接入用戶(hù)執(zhí)行的舊功能完成之后,下次接入時(shí)將全部執(zhí)行新功能。當(dāng) 該某業(yè)務(wù)的在線(xiàn)用戶(hù)全部退出后,舊功能所占內(nèi)存將由JAVA虛擬機(jī)自動(dòng)進(jìn)行回收。JAVA虛 擬機(jī)的這種垃圾回收機(jī)制可以如下表述 —個(gè)對(duì)象,可以有一個(gè)或多個(gè)引用變量指向它。當(dāng)一個(gè)對(duì)象不再有任何一個(gè)引用變量指向它時(shí),這個(gè)對(duì)象可以被JAVA虛擬機(jī)的垃圾回收機(jī)制回收了。 JAVA虛擬機(jī)的垃圾回 收機(jī)制對(duì)堆空間做實(shí)時(shí)檢測(cè)。當(dāng)發(fā)現(xiàn)某對(duì)象可以被回收時(shí),就將該對(duì)象列入待回收列表中。 在合適的時(shí)機(jī)內(nèi),JAVA虛擬機(jī)會(huì)對(duì)回收列表中的垃圾進(jìn)行回收。 圖2為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)的結(jié)構(gòu)示意圖,如圖2所示, 本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)包括設(shè)置單元20、線(xiàn)程監(jiān)控單元21、JAVA類(lèi) 文件生成單元22、配置模板設(shè)置單元23、 JAVA類(lèi)文件新增及更新單元24以及執(zhí)行單元25, 其中,設(shè)置單元20用于在所述業(yè)務(wù)系統(tǒng)中設(shè)置新增及更新業(yè)務(wù)專(zhuān)用的文件夾。設(shè)置單元20 為本發(fā)明的系統(tǒng)設(shè)置指定文件夾,以存儲(chǔ)更新或新增業(yè)務(wù)功能的JAVA類(lèi)文件。線(xiàn)程監(jiān)控 單元21用于監(jiān)控所述文件夾中設(shè)定的JAVA類(lèi)文件新增及更新?tīng)顩r。線(xiàn)程監(jiān)控單元21用 于監(jiān)控配置文件的改變及文件夾中所設(shè)定JAVA類(lèi)文件的變換情況,在有更新JAVA類(lèi)文件 加入到文件夾中時(shí),通知JAVA類(lèi)文件更新單元24。線(xiàn)程監(jiān)控單元21實(shí)現(xiàn)的主要功能是在 系統(tǒng)啟動(dòng)時(shí)啟動(dòng)監(jiān)控線(xiàn)程,該監(jiān)控線(xiàn)程用于不斷的監(jiān)控配置文件及配置文件中指定的文件 夾,以發(fā)現(xiàn)新增的及更新的JAVA類(lèi)文件。其配置過(guò)程為在web. xml中配置一個(gè)servlet,隨 服務(wù)器的啟動(dòng)同時(shí)啟動(dòng),其配置結(jié)構(gòu)如下
〈servlet> 線(xiàn)程監(jiān)控單元21主要分為兩個(gè)模塊,一個(gè)為配置文件監(jiān)控模塊30,一個(gè)為新增及 更新的JAVA類(lèi)文件監(jiān)控模塊32。配置文件監(jiān)控模塊30主要負(fù)責(zé)監(jiān)控配置文件的改變,配置 文件一旦有所變動(dòng)系統(tǒng)便重新加載新的配置文件。新增及更新JAVA類(lèi)文件監(jiān)控模塊32主 要負(fù)責(zé)監(jiān)控配置文件中指定的監(jiān)控文件夾,一旦配置文件中描述的文件夾下面的JAVA類(lèi) 文件有所增加,便通知JAVA類(lèi)文件新增及更新單元24進(jìn)行JAVA類(lèi)文件的加載。JAVA類(lèi)文 件生成單元22用于根據(jù)用戶(hù)需求確定所述業(yè)務(wù)系統(tǒng)的新增業(yè)務(wù)或/和更新業(yè)務(wù),在所述業(yè) 務(wù)系統(tǒng)的開(kāi)發(fā)環(huán)境下編譯所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用,對(duì)所述新增業(yè)務(wù)或/和更 新業(yè)務(wù)的應(yīng)用進(jìn)行調(diào)試,調(diào)試成功后生成所述新增業(yè)務(wù)或/和更新業(yè)務(wù)相應(yīng)JAVA類(lèi)文件; 將所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用的JAVA類(lèi)文件存儲(chǔ)于所述業(yè)務(wù)新增及更新指定的 文件夾中。配置模板設(shè)置單元23用于參照配置模板編寫(xiě)新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA 類(lèi)文件的配置指令完成配置文件的編寫(xiě),并用新編寫(xiě)完成的配置文件直接覆蓋舊的配置文 件。 更新JAVA類(lèi)文件的配置文件模板(卯datedes. xml)的實(shí)現(xiàn)如下



[O川]
〈servlet_name>StartDaemon〈/servlet_name> 〈servlet_class>
cn. edu. bupt. extend, monitor. StartDaemon



〈? xml version =,, 1. 0,, encoding = "UTF-8 〈update> 〈classdir>
〈imload>com. j皿.service. ChartService〈/imload> 〈reload>com. j皿.service. NewChartService〈/reload>
12
〈/classdir>
〈classdir> 〈unload>com. jun. service. RegisterService〈/unload> 〈reload>com. jun. service. NewRegisterService〈/reload> 〈/classdir>
〈classdir> 〈imload>com. j皿.service. lx>gonService〈/imload> 〈reload>com. j皿.service. NewLogonService〈/reload> 〈/classdir>
〈/update> 通過(guò)對(duì)完成更新映射的配置文件進(jìn)行類(lèi)名之間一對(duì)一的映射描述,被配置文件監(jiān) 控模塊30檢測(cè)到改變以后加載到系統(tǒng)所在內(nèi)存中并對(duì)配置文件進(jìn)行解析,并提取出配置 文件中描述的一對(duì)一的映射關(guān)系交給JAVA類(lèi)文件新增及更新模塊載入系統(tǒng)所在內(nèi)存中, 待執(zhí)行模塊執(zhí)行程序時(shí)在系統(tǒng)所在內(nèi)存中對(duì)關(guān)系映射表進(jìn)行查詢(xún)。JAVA類(lèi)文件新增及更新 單元24在所述線(xiàn)程監(jiān)控單元21監(jiān)控到所述文件夾中有設(shè)定種類(lèi)的新的JAVA類(lèi)文件導(dǎo)入 時(shí),提取所述新的JAVA類(lèi)文件,存儲(chǔ)到所述業(yè)務(wù)系統(tǒng)所在的內(nèi)存中。對(duì)于JAVA類(lèi)的業(yè)務(wù)系 統(tǒng)而言,更新到所述業(yè)務(wù)系統(tǒng)所在的內(nèi)存中具體為查找具有設(shè)定名稱(chēng)的類(lèi)或所述類(lèi)的接 口的二進(jìn)制表示,構(gòu)造供JAVA虛擬機(jī)的執(zhí)行引擎引用和解釋執(zhí)行的與所述類(lèi)或類(lèi)的接口 對(duì)應(yīng)的內(nèi)存結(jié)構(gòu)。JAVA類(lèi)文件新增及更新單元24實(shí)現(xiàn)方式為首先通過(guò)線(xiàn)程監(jiān)控單元21 發(fā)現(xiàn)的最新監(jiān)控新增文件的配置文件的描述,交給配置模板設(shè)置單元23獲取相應(yīng)的路徑, 并交回線(xiàn)程監(jiān)控單元21發(fā)現(xiàn)該路徑下面增加和更新的相應(yīng)的JAVA類(lèi)文件,使用JAVA虛擬 機(jī)中的動(dòng)態(tài)類(lèi)加載機(jī)制對(duì)新增及更新的JAVA類(lèi)文件進(jìn)行加載。JAVA語(yǔ)言具有一個(gè)重要特 性——?jiǎng)討B(tài)類(lèi)加載,它使JAVA程序可以在運(yùn)行的過(guò)程中安裝程序組件。JAVA的動(dòng)態(tài)加載 具有惰性加載、用戶(hù)自定義加載策略以及動(dòng)態(tài)命名空間的特征。動(dòng)態(tài)加載是JAVA語(yǔ)言平臺(tái) 的一種非常重要的底層實(shí)現(xiàn)機(jī)制。在標(biāo)準(zhǔn)的實(shí)現(xiàn)中,JAVA編譯器為每個(gè)JAVA類(lèi)生成一個(gè) JAVA類(lèi)文件,這種文件采用JAVA虛擬機(jī)定義的JAVA類(lèi)文件格式保存,并由JAVA虛擬機(jī)加 載并解釋執(zhí)行。在JAVA平臺(tái)中,所有類(lèi)都是由類(lèi)加載器加載的。類(lèi)加載器的實(shí)現(xiàn)可參見(jiàn)前 述本發(fā)明方法中的相關(guān)描述,這里不再贅述。JAVA類(lèi)文件新增及更新單元24利用新增功能
的實(shí)現(xiàn)將新的業(yè)務(wù)文件加載至內(nèi)存,并不斷讀取配置文件中的內(nèi)容,將新舊文件的信息存 入一個(gè)hash表中,鍵為舊文件,值為新文件。用戶(hù)在開(kāi)發(fā)程序的時(shí)候使用為其提供的代碼 進(jìn)行類(lèi)的初始化和方法的調(diào)用,每次初始化一個(gè)類(lèi)時(shí),便會(huì)在hash表中尋找鍵值對(duì)。如果 初始化的類(lèi)有更新類(lèi),則初始化更新類(lèi);否則使用原有舊業(yè)務(wù)功能類(lèi)。JAVA類(lèi)文件新增及 更新單元24中包括有新增及更新文件注冊(cè)加載模塊33。執(zhí)行單元25接收到用戶(hù)的業(yè)務(wù)請(qǐng) 求后,業(yè)務(wù)系統(tǒng)獲取系統(tǒng)的配置文件并自動(dòng)進(jìn)行解析,根據(jù)配置文件調(diào)用業(yè)務(wù)系統(tǒng)所在內(nèi) 存中相應(yīng)的JAVA類(lèi)文件,在業(yè)務(wù)系統(tǒng)的執(zhí)行環(huán)境下,JAVA類(lèi)文件按其自身的邏輯被執(zhí)行, 將JAVA類(lèi)文件的執(zhí)行結(jié)果提供至用戶(hù),使用戶(hù)獲得業(yè)務(wù)支持;其中,被執(zhí)行的JAVA類(lèi)文件 包括新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA類(lèi)文件。執(zhí)行單元25從配置模板設(shè)置單元23獲取 已載入內(nèi)存的更新映射表,并從JAVA類(lèi)文件新增及更新單元24中獲取已載入內(nèi)存的相應(yīng) JAVA類(lèi)文件,當(dāng)系統(tǒng)接到用戶(hù)的請(qǐng)求后,如果請(qǐng)求訪問(wèn)的是新增的業(yè)務(wù)邏輯,則直接訪問(wèn)已經(jīng)加載到內(nèi)存的新增JAVA類(lèi)文件,如果請(qǐng)求訪問(wèn)的不是新增的業(yè)務(wù)邏輯,則執(zhí)行單元25先 進(jìn)入業(yè)務(wù)系統(tǒng)所在內(nèi)存中的更新映射表進(jìn)行查詢(xún),如果更新映射表中不存在需要訪問(wèn)類(lèi)的 映射關(guān)系則直接執(zhí)行該類(lèi)的業(yè)務(wù)邏輯并將執(zhí)行結(jié)果返回給用戶(hù),如果更新映射表中存在需 要訪問(wèn)的類(lèi)的映射關(guān)系,則通過(guò)該映射關(guān)系執(zhí)行更新后的JAVA類(lèi)文件中的業(yè)務(wù)邏輯,并將 執(zhí)行結(jié)果返回給用戶(hù)。在JAVA虛擬機(jī)規(guī)范中,加載和連接被定義為兩個(gè)相互遞歸的過(guò)程。 加載是指JAVA虛擬機(jī)根據(jù)指定的類(lèi)名或接口名查找相應(yīng)的JAVA類(lèi)文件,并將JAVA類(lèi)文件 裝載到運(yùn)行環(huán)境中的過(guò)程。連接指JAVA虛擬機(jī)對(duì)JAVA類(lèi)文件進(jìn)行驗(yàn)證和解析符號(hào)引用的 過(guò)程。JAVA虛擬機(jī)的動(dòng)態(tài)加載是通過(guò)JAVA系統(tǒng)類(lèi)Java. lang. ClassLoader及其子類(lèi)實(shí)現(xiàn) 的。ClassLoader類(lèi)是一個(gè)抽象類(lèi),其實(shí)例或其子類(lèi)的實(shí)例被稱(chēng)為類(lèi)加載器。當(dāng)指定了一個(gè) 類(lèi)名后,類(lèi)加載器會(huì)尋找相對(duì)應(yīng)的JAVA類(lèi)文件并將其加載到JAVA虛擬機(jī)環(huán)境中,同時(shí)為該 類(lèi)創(chuàng)建一個(gè)對(duì)應(yīng)的類(lèi)對(duì)象。 一般情況下,JAVA虛擬機(jī)從本地文件系統(tǒng)中加載JAVA類(lèi)文件, JAVA虛擬機(jī)也允許應(yīng)用程序通過(guò)實(shí)現(xiàn)ClassLoader的子類(lèi)從網(wǎng)絡(luò)加載JAVA類(lèi)文件。執(zhí)行 單元25可通過(guò)JAVA虛擬機(jī)的連接過(guò)程而實(shí)現(xiàn),從而實(shí)現(xiàn)對(duì)JAVA類(lèi)文件的解析執(zhí)行,為用 戶(hù)提供新增或更新的業(yè)務(wù),提供了相應(yīng)的業(yè)務(wù)支持。執(zhí)行單元25中還包括有配置文件解析 模塊31。 圖3為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)中各單元核心模塊邏輯結(jié) 構(gòu)示意圖,如圖3所示,本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)的核心模塊包括配 置文件監(jiān)控模塊30、配置文件解析模塊31、新增及更新的JAVA類(lèi)文件監(jiān)控模塊32以及新 增及更新文件注冊(cè)加載模塊33,其中,業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)包含四個(gè)包,每個(gè)包劃分為一個(gè)模 塊,各個(gè)包的成分包括 common包包含了其它模塊用到的公共類(lèi),比如常量數(shù)據(jù)聲明類(lèi)、封裝插件類(lèi)、業(yè) 務(wù)配置改變時(shí)的通知接口實(shí)現(xiàn)類(lèi)等。 monitor包包含了與監(jiān)控線(xiàn)程相關(guān)的類(lèi),比如監(jiān)控線(xiàn)程類(lèi)、監(jiān)控器類(lèi)等。 parse包包含了解析updatedes. xml文件用到的相關(guān)類(lèi),以及初始化及反射調(diào)用
某個(gè)對(duì)象的方法的相關(guān)類(lèi)。 register包包含了與注冊(cè)相關(guān)的類(lèi),即如果能正常創(chuàng)建實(shí)例對(duì)象,則將該文件 封裝為插件類(lèi)型。最后將該文件封裝成可用插件類(lèi)型,更新已有文件集合。
以下詳細(xì)說(shuō)明上述各模塊是如何實(shí)現(xiàn)的。 圖4為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)中配置文件監(jiān)控模塊的 實(shí)現(xiàn)結(jié)構(gòu)示意圖,如圖4所示,StartDaemon類(lèi)為系統(tǒng)入口 ,觸發(fā)監(jiān)視目錄程序的執(zhí)行。 FileMonitor類(lèi)負(fù)責(zé)不斷的檢測(cè)監(jiān)視目錄是否發(fā)生改變,并喚醒對(duì)新增業(yè)務(wù)和更新業(yè)務(wù)的 發(fā)現(xiàn)和注冊(cè)的操作。Notifier類(lèi)負(fù)責(zé)從監(jiān)視目錄中獲取新增業(yè)務(wù)文件和更新業(yè)務(wù)文件,進(jìn) 行合法性檢驗(yàn)并將文件路徑轉(zhuǎn)換為類(lèi)名,并調(diào)用注冊(cè)模塊。圖5為本發(fā)明實(shí)施例的業(yè)務(wù)系 統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)中新增及更新的JAVA類(lèi)文件監(jiān)控模塊的實(shí)現(xiàn)結(jié)構(gòu)示意圖,如圖5所 示,ClassOb jectlnterface接口負(fù)責(zé)力口載類(lèi)的接口 ,由register包中ClassOb jectFactory 類(lèi)實(shí)現(xiàn)。ConfigWr即per類(lèi)負(fù)責(zé)讀取配置文件,從配置文件中獲取監(jiān)控目錄。Records類(lèi)負(fù) 責(zé)保存新增業(yè)務(wù)和更新業(yè)務(wù)的發(fā)現(xiàn)記錄。Plugln類(lèi)負(fù)責(zé)保存新增業(yè)務(wù)和更新業(yè)務(wù)的相關(guān)信 息。AvailPlugln類(lèi)負(fù)責(zé)保存合法的新增業(yè)務(wù)和更新業(yè)務(wù)的相關(guān)信息。FilePool類(lèi)負(fù)責(zé)發(fā) 現(xiàn)新增業(yè)務(wù)和更新業(yè)務(wù),并保存其文件信息和合法業(yè)務(wù)文件的信息,更新內(nèi)存中新增業(yè)務(wù)和更新業(yè)務(wù)的列表。圖6為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)中新增及更新文 件注冊(cè)加載模塊的實(shí)現(xiàn)結(jié)構(gòu)示意圖,如圖6所示,ClassObjectFactory類(lèi)實(shí)現(xiàn)common包中 的Class0b jectlnterface接口 ,加載新增業(yè)務(wù)文件和更新業(yè)務(wù)文件。register類(lèi)負(fù)責(zé)提取 內(nèi)存中新增業(yè)務(wù)和更新業(yè)務(wù),并調(diào)用ClassObjectFactory類(lèi)對(duì)新增業(yè)務(wù)文件和更新業(yè)務(wù) 文件進(jìn)行注冊(cè)加載。圖7為本發(fā)明實(shí)施例的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)中配置文件解析 模塊的實(shí)現(xiàn)結(jié)構(gòu)示意圖,如圖7所示,ClassSet類(lèi)負(fù)責(zé)存儲(chǔ)被更新業(yè)務(wù)的列表和新舊業(yè)務(wù) 更新的映射表。ParseDescriptionlnterface接口負(fù)責(zé)獲取被更新業(yè)務(wù)的列表和新舊業(yè)務(wù) 更新的映射表的接口 。 ParseDescription類(lèi)實(shí)現(xiàn)ParseDescriptionlnterface接口 ,負(fù)責(zé) 獲取被更新業(yè)務(wù)的列表和新舊業(yè)務(wù)更新的映射列表。ParseResult類(lèi)負(fù)責(zé)解析更新業(yè)務(wù)功 能的配置文件,獲取新舊業(yè)務(wù)更新的配置信息,并將其信息存儲(chǔ)到ClassSet類(lèi)中。Init類(lèi) 提供為程序員開(kāi)發(fā)使用的對(duì)象初始化的方法和方法調(diào)用的方法,程序員通過(guò)使用這些方法 對(duì)對(duì)象進(jìn)行初始化和方法調(diào)用可通過(guò)配置文件實(shí)現(xiàn)新舊業(yè)務(wù)的自動(dòng)切換。
本發(fā)明業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)就是為了實(shí)現(xiàn)不影響用戶(hù)對(duì)現(xiàn)有業(yè)務(wù)的使用的前提下 對(duì)新業(yè)務(wù)進(jìn)行動(dòng)態(tài)的加載以及對(duì)升級(jí)更新業(yè)務(wù)進(jìn)行實(shí)時(shí)替換的系統(tǒng),其主要功能包括
實(shí)現(xiàn)系統(tǒng)集成業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)包含一個(gè)入口供業(yè)務(wù)系統(tǒng)調(diào)用,能夠被任何業(yè) 務(wù)系統(tǒng)調(diào)用執(zhí)行以使得該系統(tǒng)能夠正常運(yùn)行在服務(wù)器上,從而可以通過(guò)該系統(tǒng)發(fā)現(xiàn)新的業(yè) 務(wù)或發(fā)現(xiàn)更新過(guò)的業(yè)務(wù)。 向運(yùn)行的業(yè)務(wù)系統(tǒng)中添加新的業(yè)務(wù)在原有業(yè)務(wù)平臺(tái)上添加新的業(yè)務(wù),可以采用 插件的實(shí)現(xiàn)方法,發(fā)現(xiàn)的每個(gè)新業(yè)務(wù)都作為一個(gè)新的插件來(lái)使用,通過(guò)對(duì)插件的發(fā)現(xiàn),合法 性檢查,注冊(cè)添加后,可以對(duì)新業(yè)務(wù)進(jìn)行調(diào)用。 對(duì)插件的發(fā)現(xiàn)業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)能夠檢測(cè)到指定的新業(yè)務(wù)所在目錄,對(duì)新業(yè)務(wù) 所在目錄中的所有JAVA類(lèi)文件進(jìn)行掃描,主動(dòng)發(fā)現(xiàn)業(yè)務(wù)系統(tǒng)中新添加的業(yè)務(wù),并提取出所 有JAVA類(lèi)文件的文件名,將所有文件的文件名保存在一張列表里,并輸出對(duì)新插件的發(fā)現(xiàn) 記錄。對(duì)新業(yè)務(wù)進(jìn)行合法性檢查系統(tǒng)對(duì)列表中的新插件進(jìn)行合法性檢查,檢查掃描列表中 的文件名是否為合法的JAVA類(lèi)文件,如果不是則不進(jìn)行加載操作,避免出現(xiàn)無(wú)法進(jìn)行動(dòng)態(tài) 加載的文件加入到列表中而在對(duì)新業(yè)務(wù)注冊(cè)添加時(shí)出現(xiàn)加載錯(cuò)誤。 新業(yè)務(wù)注冊(cè)添加業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)對(duì)通過(guò)合法性檢查的JAVA類(lèi)文件進(jìn)行注冊(cè) 添加,通過(guò)JAVA的反射機(jī)制及類(lèi)加載機(jī)制,從列表中將所有的JAVA類(lèi)文件名取出,并查找 到相應(yīng)的文件目錄,啟動(dòng)類(lèi)加載器,對(duì)列表中的JAVA類(lèi)文件逐一加載,并輸出對(duì)文件的注
冊(cè)信息。 在運(yùn)行的業(yè)務(wù)系統(tǒng)中更新業(yè)務(wù)在原有業(yè)務(wù)平臺(tái)上更新業(yè)務(wù),也可以采用插件的 實(shí)現(xiàn)方法,發(fā)現(xiàn)的每個(gè)經(jīng)過(guò)更新的業(yè)務(wù)都作為一個(gè)新的插件來(lái)使用,通過(guò)對(duì)插件的發(fā)現(xiàn),合 法性檢查,注冊(cè)添加后,通過(guò)與舊業(yè)務(wù)對(duì)比與舊業(yè)務(wù)進(jìn)行切換,對(duì)舊業(yè)務(wù)反注冊(cè),使新業(yè)務(wù) 上線(xiàn),舊業(yè)務(wù)下線(xiàn)。 更新業(yè)務(wù)的插件發(fā)現(xiàn)業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)能夠檢測(cè)到指定的存放更新業(yè)務(wù)所在的
目錄,對(duì)更新業(yè)務(wù)所在目錄中的所有JAVA類(lèi)文件進(jìn)行掃描,通過(guò)描述文件中配置的新舊業(yè)
務(wù)文件的映射主動(dòng)發(fā)現(xiàn)更新后的文件,并提取出所有更新后的JAVA類(lèi)文件的文件名,并將
所有更新后的文件的文件名保存在一張列表里,并輸出對(duì)新插件的發(fā)現(xiàn)記錄。
對(duì)更新業(yè)務(wù)的合法性檢查系統(tǒng)對(duì)列表中的插件進(jìn)行合法性檢查,掃描列表中的文件名是否為合法的JAVA類(lèi)文件,如果不是則不進(jìn)行加載操作,避免出現(xiàn)無(wú)法進(jìn)行動(dòng)態(tài)加 載的文件加入到列表中而在對(duì)新業(yè)務(wù)注冊(cè)添加時(shí)出現(xiàn)加載錯(cuò)誤。 新舊業(yè)務(wù)的替換業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)對(duì)通過(guò)合法性檢查的JAVA類(lèi)文件進(jìn)行注冊(cè)
添加,通過(guò)JAVA的反射機(jī)制及類(lèi)加載機(jī)制,從列表中將所有的JAVA類(lèi)文件名取出,并查找
到相應(yīng)的文件目錄,啟動(dòng)類(lèi)加載器,對(duì)列表中的JAVA類(lèi)文件逐一加載,并輸出對(duì)文件的注
冊(cè)信息,新業(yè)務(wù)注冊(cè)加載完畢后,若有新的訪問(wèn)者訪問(wèn)業(yè)務(wù)則直接轉(zhuǎn)入到更新后的業(yè)務(wù)中
執(zhí)行,已經(jīng)連接到舊業(yè)務(wù)的將舊業(yè)務(wù)執(zhí)行完畢,直到舊業(yè)務(wù)已經(jīng)無(wú)人使用時(shí)對(duì)舊業(yè)務(wù)進(jìn)行
反注冊(cè),即將舊業(yè)務(wù)廢除,使舊業(yè)務(wù)下線(xiàn)。上述所述JAVA的反射機(jī)制是JAVA被視為動(dòng)態(tài)語(yǔ)
言的關(guān)鍵,它允許程序于執(zhí)行期取得任何已知名稱(chēng)的類(lèi)的內(nèi)部信息,包括包名、參數(shù)、超類(lèi)、
執(zhí)行接口、內(nèi)部類(lèi)、外部類(lèi)、域名、構(gòu)造器、方法及修飾符,并可于執(zhí)行期生成實(shí)例、變更域的
內(nèi)容或喚起方法。根據(jù)JAVA的反射機(jī)制可以在執(zhí)行過(guò)程中決定某個(gè)對(duì)象所屬的類(lèi),取得類(lèi)
的修飾符、域名、方法、構(gòu)造器和超類(lèi)的相關(guān)信息,找出接口中的約束和方法聲明,為一個(gè)執(zhí)
行期才得知名稱(chēng)的類(lèi)產(chǎn)生對(duì)象,以及喚起執(zhí)行期才能獲得的對(duì)象的方法。 本發(fā)明業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)中,在新業(yè)務(wù)的注冊(cè)添加以及新舊業(yè)務(wù)的替換中都使用
到了 JAVA的反射機(jī)制,在新業(yè)務(wù)的注冊(cè)添加過(guò)程中通過(guò)JAVA的反射機(jī)制在加載過(guò)程中獲
取類(lèi)的包名及其類(lèi)名并將其存儲(chǔ)在業(yè)務(wù)系統(tǒng)所在的內(nèi)存中,在新舊業(yè)務(wù)的替換中,系統(tǒng)通
過(guò)解析配置文件updates, xml,將該配置文件中被更新的類(lèi)以及更新的類(lèi)的類(lèi)名映射關(guān)系
載入業(yè)務(wù)系統(tǒng)所在內(nèi)存中,在新舊業(yè)務(wù)進(jìn)行替換時(shí)從內(nèi)存中取出映射關(guān)系中存儲(chǔ)的新業(yè)務(wù)
的類(lèi)名并獲取該類(lèi)名對(duì)應(yīng)類(lèi)的構(gòu)造器,用獲取的構(gòu)造器以及構(gòu)造器中使用的參數(shù)及參數(shù)類(lèi)
型動(dòng)態(tài)地初始化類(lèi)的對(duì)象,從而實(shí)現(xiàn)了在運(yùn)行期中舊類(lèi)和新類(lèi)之間的切換,并通過(guò)在運(yùn)行
期中獲取的類(lèi)的對(duì)象及類(lèi)中的方法名和方法中使用的參數(shù)及參數(shù)類(lèi)型來(lái)動(dòng)態(tài)調(diào)用某個(gè)對(duì)
象中的方法,從而實(shí)現(xiàn)了在運(yùn)行期對(duì)某個(gè)對(duì)象中方法的動(dòng)態(tài)調(diào)用,從而實(shí)現(xiàn)了業(yè)務(wù)之間的
切換,即新舊業(yè)務(wù)之間的替換。 本發(fā)明業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)中,JAVA類(lèi)文件生成單元22以及執(zhí)行單元25是現(xiàn)有的 處理單元,其中,執(zhí)行單元25是JAVA應(yīng)用系統(tǒng)的基本功能單元;JAVA類(lèi)文件生成單元22由 業(yè)務(wù)維護(hù)人員根據(jù)業(yè)務(wù)需要來(lái)生成,并不是本發(fā)明業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)改進(jìn)所涉及的。
以下簡(jiǎn)單介紹本發(fā)明業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)是如何被用戶(hù)使用的,具體是通過(guò)向用戶(hù) 提供接口來(lái)實(shí)現(xiàn)的,以支持用戶(hù)的業(yè)務(wù)動(dòng)態(tài)加載。 系統(tǒng)為用戶(hù)提供了一個(gè)名為Init的類(lèi),該類(lèi)有三個(gè)方法,分別為
1. public Object newObject (String classname); 2. public Object newObject (String classname, Object [] Obpara, Class [] Clpa:ra); 3.public Object InvokeMethod(String methodName, Object obj, Object[] Obpa:ra, Class [] Clpa:ra)。 第一個(gè)方法的作用是通過(guò)無(wú)參數(shù)的構(gòu)造器初始化一個(gè)類(lèi)對(duì)象,第二個(gè)方法的作用 是初始化一個(gè)帶參數(shù)構(gòu)造器類(lèi)的對(duì)象,第三個(gè)方法的作用是調(diào)用某個(gè)對(duì)象的類(lèi)方法。系 統(tǒng)在啟動(dòng)后會(huì)不斷的檢測(cè)解析updatedes. xml配置文件,并把進(jìn)行過(guò)更新配置的所有舊 功能類(lèi)保存在內(nèi)存的一個(gè)列表unloadList里,把所有新舊類(lèi)的映射關(guān)系保存在內(nèi)存的一 個(gè)映射表reLoadTable里,在用戶(hù)通過(guò)前兩個(gè)方法來(lái)初始化一個(gè)對(duì)象時(shí)會(huì)首先去判斷在
16unloadList里是否存在要初始化的類(lèi),如果unloadList里沒(méi)有該類(lèi)則直接對(duì)該類(lèi)進(jìn)行初 始化,如果unloadList里存在該類(lèi),則從reLoadTable里獲取對(duì)應(yīng)該類(lèi)的新類(lèi),并對(duì)新類(lèi)進(jìn) 行初始化。在使用上述的第三個(gè)方法進(jìn)行方法調(diào)用時(shí)第二個(gè)參數(shù)Object obj會(huì)將初始化 的類(lèi)對(duì)象傳遞進(jìn)來(lái),以確定是調(diào)用舊類(lèi)的某個(gè)方法還是新類(lèi)的某個(gè)方法。前兩個(gè)方法與第 三個(gè)方法搭配使用,實(shí)現(xiàn)了由舊業(yè)務(wù)向新業(yè)務(wù)之間的切換。 本發(fā)明的業(yè)務(wù)系統(tǒng)為JAVA支持的業(yè)務(wù)系統(tǒng),所述業(yè)務(wù)包括各種Web服務(wù)業(yè)務(wù)、電 信服務(wù)業(yè)務(wù)、基于各種操作系統(tǒng)的服務(wù)業(yè)務(wù)等。 本發(fā)明的業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)是實(shí)現(xiàn)圖1所示方法的系統(tǒng),其各單元的 功能及實(shí)現(xiàn)方式可參照?qǐng)D1所示方法加以理解。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,圖2所示的各 單元可通過(guò)編寫(xiě)程序而實(shí)現(xiàn)。 目前,對(duì)于用JAVA開(kāi)發(fā)的已經(jīng)上線(xiàn)運(yùn)行的業(yè)務(wù)系統(tǒng),如果對(duì)其增加新功能或者對(duì) 原有功能進(jìn)行更新,必須停止服務(wù)器的運(yùn)行,并對(duì)新業(yè)務(wù)或更新業(yè)務(wù)進(jìn)行重新編譯或發(fā)布, 這必然導(dǎo)致業(yè)務(wù)服務(wù)在一定時(shí)間內(nèi)處于停滯狀態(tài),從而影響用戶(hù)對(duì)系統(tǒng)的使用,并會(huì)造成 一部分經(jīng)濟(jì)損失。本發(fā)明業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng)能夠在不停機(jī)的情況下動(dòng)態(tài)的對(duì)新增功能進(jìn)行 加載投入使用,動(dòng)態(tài)的加載更新業(yè)務(wù)并進(jìn)行舊業(yè)務(wù)向新業(yè)務(wù)的切換,將舊業(yè)務(wù)逐漸拋棄使 新業(yè)務(wù)投入使用,這個(gè)過(guò)程不會(huì)影響已經(jīng)在使用舊業(yè)務(wù)的用戶(hù),新來(lái)的用戶(hù)請(qǐng)求也可以直 接執(zhí)行新的業(yè)務(wù),該系統(tǒng)對(duì)于訪問(wèn)業(yè)務(wù)系統(tǒng)的用戶(hù)來(lái)說(shuō)是透明的,克服了對(duì)JAVA開(kāi)發(fā)的業(yè) 務(wù)系統(tǒng)新增業(yè)務(wù)或更新業(yè)務(wù)時(shí)必須停機(jī)的缺陷。本發(fā)明向用戶(hù)提供業(yè)務(wù)支持的接口,用戶(hù) 可以根據(jù)自身業(yè)務(wù)的特點(diǎn),自己設(shè)計(jì)新增業(yè)務(wù)或更新業(yè)務(wù),所支持業(yè)務(wù)的靈活度相當(dāng)大,并 提供標(biāo)準(zhǔn)的配置文件,大大方便了用戶(hù)新增及更新業(yè)務(wù)。 以上所述,僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。
權(quán)利要求
一種業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載方法,其特征在于,在所述業(yè)務(wù)系統(tǒng)中指定新增及更新業(yè)務(wù)存放的文件夾,對(duì)配置新增JAVA類(lèi)文件及更新JAVA類(lèi)文件的配置文件進(jìn)行初始化配置,并設(shè)置監(jiān)控所述文件夾中設(shè)定的JAVA類(lèi)文件更新?tīng)顩r的線(xiàn)程;根據(jù)用戶(hù)需求確定所述業(yè)務(wù)系統(tǒng)的新增業(yè)務(wù)或/和更新業(yè)務(wù),在所述業(yè)務(wù)系統(tǒng)的開(kāi)發(fā)環(huán)境下編譯所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用,對(duì)所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用進(jìn)行調(diào)試,調(diào)試成功后將所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用對(duì)應(yīng)的JAVA源文件生成JAVA類(lèi)文件;所述方法包括以下步驟A、將所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用的JAVA類(lèi)文件存儲(chǔ)于所述業(yè)務(wù)新增及更新指定的文件夾中,參照配置模板編寫(xiě)新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA類(lèi)文件的配置指令,從而實(shí)現(xiàn)配置文件的編寫(xiě),并用新編寫(xiě)完成的配置文件直接覆蓋舊的配置文件;所述配置文件分為兩個(gè),一個(gè)是監(jiān)控新增文件的配置文件,一個(gè)是完成更新映射的配置文件;B、所述線(xiàn)程監(jiān)控文件夾中設(shè)定種類(lèi)的JAVA類(lèi)文件的實(shí)時(shí)新增和更新?tīng)顩r,在有新的JAVA類(lèi)文件導(dǎo)入時(shí),提取新的JAVA類(lèi)文件,存儲(chǔ)到業(yè)務(wù)系統(tǒng)所在的內(nèi)存中;C、接收到用戶(hù)的業(yè)務(wù)請(qǐng)求后,業(yè)務(wù)系統(tǒng)獲取系統(tǒng)的配置文件并自動(dòng)進(jìn)行解析,根據(jù)所述配置文件調(diào)用業(yè)務(wù)系統(tǒng)所在的內(nèi)存中相應(yīng)的JAVA類(lèi)文件,在業(yè)務(wù)系統(tǒng)的執(zhí)行環(huán)境下,JAVA類(lèi)文件按其自身的邏輯被執(zhí)行,將JAVA類(lèi)文件的執(zhí)行結(jié)果提供至用戶(hù),使用戶(hù)獲得業(yè)務(wù)支持;其中,被執(zhí)行的JAVA類(lèi)文件包括新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA類(lèi)文件。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟B中提取所述新的JAVA類(lèi)文件 存儲(chǔ)到所述業(yè)務(wù)系統(tǒng)所在的內(nèi)存中,具體為通過(guò)解析監(jiān)控新增文件的配置文件中配置的 路徑名自動(dòng)發(fā)現(xiàn)該路徑下的新增JAVA類(lèi)文件,并通過(guò)類(lèi)加載器將其加載到業(yè)務(wù)系統(tǒng)所在 的內(nèi)存中。
3. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述設(shè)置所述JAVA類(lèi)文件新增到所述 業(yè)務(wù)系統(tǒng)中的配置模板,具體為根據(jù)所述JAVA類(lèi)文件的路徑、存儲(chǔ)地址的信息建立所述 JAVA類(lèi)文件發(fā)現(xiàn)的模板,將新增JAVA類(lèi)文件所在的路徑或存儲(chǔ)地址信息替換所述模板中 的路徑、存儲(chǔ)地址信息,即編寫(xiě)所述新增JAVA類(lèi)文件的配置文件;設(shè)置所述JAVA類(lèi)文件替 換所述業(yè)務(wù)系統(tǒng)中原JAVA類(lèi)文件的配置模板,具體為根據(jù)所述JAVA類(lèi)文件的名稱(chēng)、存儲(chǔ) 地址的信息建立欲更新的JAVA類(lèi)文件的調(diào)用及阻止待替換的JAVA類(lèi)文件調(diào)用的應(yīng)用的模 板,將更新JAVA類(lèi)文件及待更新JAVA類(lèi)文件的名稱(chēng)或存儲(chǔ)地址分別替換所述應(yīng)用的模板 中的更新JAVA類(lèi)文件及待更新JAVA類(lèi)文件的名稱(chēng)、存儲(chǔ)地址,即編寫(xiě)所述更新JAVA類(lèi)文 件的配置文件。
4. 根據(jù)權(quán)利要求l所述的方法,其特征在于,所述步驟A中用新編寫(xiě)完成的配置文件直 接覆蓋舊的配置文件,具體為將編寫(xiě)好的已測(cè)試成功的配置文件覆蓋掉原先的配置文件, 以避免直接進(jìn)行配置而導(dǎo)致配置中出現(xiàn)異常。
5. 根據(jù)權(quán)利要求l所述的方法,其特征在于,所述業(yè)務(wù)系統(tǒng)為JAVA支持的業(yè)務(wù)系統(tǒng),所 述業(yè)務(wù)包括各種Web服務(wù)業(yè)務(wù)、電信服務(wù)業(yè)務(wù)、基于各種操作系統(tǒng)的服務(wù)業(yè)務(wù)。
6. 根據(jù)權(quán)利要求5所述的方法,其特征在于,所述步驟B中提取所述新的JAVA類(lèi)文件 存儲(chǔ)到所述業(yè)務(wù)系統(tǒng)所在的內(nèi)存中,具體為查找具有設(shè)定名稱(chēng)的類(lèi)或所述類(lèi)的接口的二 進(jìn)制表示,構(gòu)造供JAVA虛擬機(jī)的執(zhí)行引擎引用和解釋執(zhí)行的與所述類(lèi)或類(lèi)的接口對(duì)應(yīng)的內(nèi)存結(jié)構(gòu)。
7. —種業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載系統(tǒng),其特征在于,包括 設(shè)置單元,用于在所述業(yè)務(wù)系統(tǒng)中設(shè)置新增及更新業(yè)務(wù)指定的文件夾; 線(xiàn)程監(jiān)控單元,用于監(jiān)控配置文件的改變及所述文件夾中JAVA類(lèi)文件的新增和更新?tīng)顩r;JAVA類(lèi)文件生成單元,用于根據(jù)用戶(hù)需求確定所述業(yè)務(wù)系統(tǒng)的新增業(yè)務(wù)或/和更新業(yè) 務(wù),在所述業(yè)務(wù)系統(tǒng)的開(kāi)發(fā)環(huán)境下編譯所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用,對(duì)所述新增 業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用進(jìn)行調(diào)試,調(diào)試成功后生成所述新增業(yè)務(wù)或/和更新業(yè)務(wù)相應(yīng) JAVA類(lèi)文件;將所述新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用的JAVA類(lèi)文件存儲(chǔ)于所述業(yè)務(wù)新增 及更新指定的文件夾中;配置模板設(shè)置單元,參照配置模板編寫(xiě)新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA類(lèi)文件的配置 指令完成配置文件的編寫(xiě),并用新編寫(xiě)完成的配置文件直接覆蓋舊的配置文件;JAVA類(lèi)文件新增及更新單元,在所述線(xiàn)程監(jiān)控單元監(jiān)控到所述文件夾中有設(shè)定種類(lèi)的 新的JAVA類(lèi)文件導(dǎo)入時(shí),提取所述新的JAVA類(lèi)文件,存儲(chǔ)到所述業(yè)務(wù)系統(tǒng)所在的內(nèi)存中;執(zhí)行單元,接收到用戶(hù)的業(yè)務(wù)請(qǐng)求后,業(yè)務(wù)系統(tǒng)獲取系統(tǒng)的配置文件并自動(dòng)進(jìn)行解析, 根據(jù)配置文件調(diào)用業(yè)務(wù)系統(tǒng)所在的內(nèi)存中相應(yīng)的JAVA類(lèi)文件,在業(yè)務(wù)系統(tǒng)的執(zhí)行環(huán)境下, JAVA類(lèi)文件按其自身的邏輯被執(zhí)行,將JAVA類(lèi)文件的執(zhí)行結(jié)果提供至用戶(hù),使用戶(hù)獲得業(yè) 務(wù)支持;其中,被執(zhí)行的JAVA類(lèi)文件包括新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA類(lèi)文件。
8. 根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于,所述業(yè)務(wù)系統(tǒng)為JAVA支持的業(yè)務(wù)系統(tǒng),所 述業(yè)務(wù)包括各種Web服務(wù)業(yè)務(wù)、電信服務(wù)業(yè)務(wù)、基于各種操作系統(tǒng)的服務(wù)業(yè)務(wù)。
全文摘要
本發(fā)明公開(kāi)了一種業(yè)務(wù)系統(tǒng)中業(yè)務(wù)動(dòng)態(tài)加載的方法,包括A將新增業(yè)務(wù)或/和更新業(yè)務(wù)的應(yīng)用的JAVA類(lèi)文件存儲(chǔ)于業(yè)務(wù)新增及更新指定的文件夾中,參照配置模板編寫(xiě)新增業(yè)務(wù)或/和更新業(yè)務(wù)的JAVA類(lèi)文件的配置文件,并用新編寫(xiě)完成的配置文件直接覆蓋舊的配置文件;B線(xiàn)程監(jiān)控文件夾中設(shè)定種類(lèi)的JAVA類(lèi)文件的實(shí)時(shí)新增和更新?tīng)顩r,在有新的JAVA類(lèi)文件導(dǎo)入時(shí),提取新的JAVA類(lèi)文件,存儲(chǔ)到業(yè)務(wù)系統(tǒng)所在的內(nèi)存中;C接收到用戶(hù)的業(yè)務(wù)請(qǐng)求后,業(yè)務(wù)系統(tǒng)獲取系統(tǒng)的配置文件并自動(dòng)進(jìn)行解析,根據(jù)配置文件調(diào)用業(yè)務(wù)系統(tǒng)所在的內(nèi)存中相應(yīng)的JAVA類(lèi)文件,JAVA類(lèi)文件按其自身的邏輯被執(zhí)行,將執(zhí)行結(jié)果提供至用戶(hù),使用戶(hù)獲得業(yè)務(wù)支持。本發(fā)明同時(shí)公開(kāi)了一種實(shí)現(xiàn)上述方法的系統(tǒng)。本發(fā)明實(shí)現(xiàn)了業(yè)務(wù)的動(dòng)態(tài)加載。
文檔編號(hào)H04M3/42GK101771762SQ20091007621
公開(kāi)日2010年7月7日 申請(qǐng)日期2009年1月6日 優(yōu)先權(quán)日2009年1月6日
發(fā)明者劉俊, 孟祥武, 張玉潔, 張立達(dá) 申請(qǐng)人:北京郵電大學(xué)
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
四子王旗| 大荔县| 竹溪县| 浑源县| 中牟县| 龙里县| 神农架林区| 当涂县| 咸丰县| 丰城市| 都昌县| 伊宁县| 耒阳市| 冕宁县| 张北县| 泾阳县| 孝义市| 通州市| 内黄县| 岳池县| 莆田市| 屯昌县| 罗甸县| 井研县| 邯郸市| 庄浪县| 万宁市| 新河县| 祁阳县| 邯郸市| 太谷县| 剑川县| 茌平县| 保康县| 淳化县| 柳江县| 大足县| 崇信县| 浏阳市| 甘孜县| 蚌埠市|