專利名稱:基于Java平臺的Web業(yè)務(wù)系統(tǒng)的動態(tài)升級方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機(jī)領(lǐng)域,特別涉及一種基于Java平臺的Web業(yè)務(wù)系統(tǒng)的動態(tài)升級 方法及裝置。
背景技術(shù):
隨著Web技術(shù)的不斷更新,基于不同架構(gòu)的Web業(yè)務(wù)系統(tǒng)層出不窮,由于Java語 言具有跨平臺優(yōu)勢,使基于J2EE的Web業(yè)務(wù)系統(tǒng)應(yīng)用更加廣泛,幾乎遍及各行各業(yè),例如, 電信行業(yè),金融行業(yè)等等。業(yè)務(wù)需求變化頻繁,通常需要Web業(yè)務(wù)系統(tǒng)M小時不間斷服務(wù), 而當(dāng)進(jìn)行系統(tǒng)升級的時候,則需要停止Web業(yè)務(wù)系統(tǒng),這勢必會中斷當(dāng)前用戶所進(jìn)行的業(yè) 務(wù)操作,對Web業(yè)務(wù)系統(tǒng)的正常運(yùn)作會造成一定的影響。鑒于這種弊端與局限,就需要基于J2EE實現(xiàn)Web業(yè)務(wù)系統(tǒng)的動態(tài)升級,即在Web 容器內(nèi),實現(xiàn)Java類文件的熱加載。
發(fā)明內(nèi)容
本發(fā)明實施例提供一種基于Java平臺的Web業(yè)務(wù)系統(tǒng)動態(tài)升級方法及裝置,用以 在不中斷Web業(yè)務(wù)的前提下,實現(xiàn)Web業(yè)務(wù)系統(tǒng)的動態(tài)升級。本發(fā)明實施例提供的具體技術(shù)方案如下一種基于Java平臺的Web業(yè)務(wù)系統(tǒng)動態(tài)升級方法,包括新建一個自定義的類加載器,令新建的類加載器繼承指定的父類加載器,且將所 述父類加載器設(shè)置為空值;采用所述新建的類加載器在預(yù)設(shè)存儲位置加載至少一個Java類文件;采用加載Java類文件后的類加載器替換Java平臺內(nèi)核中指定的已加載的類加載器。一種基于Java平臺的Web業(yè)務(wù)系統(tǒng)動態(tài)升級裝置,包括 建立單元,用于新建一個自定義的類加載器,令新建的類加載器繼承指定的父類 加載器,且將所述父類加載器設(shè)置為空值;第一加載單元,用于采用所述新建的類加載器在預(yù)設(shè)存儲位置加載至少一個Java 類文件;第二加載單元,采用加載Java類文件后的類加載器替換Java平臺內(nèi)核中指定的 其他類加載器。本發(fā)明實施例中,管理人員只需要采用自定義的類加載器加載指定位置的Java 類文件,并采用加載Java類文件后的類加載器替換Java平臺內(nèi)核中指定的類加載器,即可 采用升級后的Java類文件直接替換原有的Java類文件,從而實現(xiàn)了 Web業(yè)務(wù)系統(tǒng)的動態(tài) 升級,不需要重啟Web服務(wù)器,也不需要中斷Web業(yè)務(wù)服務(wù),從而保證了 Web業(yè)務(wù)的連續(xù)性, 提高了 Web業(yè)務(wù)系統(tǒng)的性能和服務(wù)質(zhì)量。
圖1為現(xiàn)有技術(shù)下本發(fā)明中Java類加載器層次結(jié)構(gòu)圖;圖2為現(xiàn)有技術(shù)下Java類加載器工作流程示意圖;圖3A為本發(fā)明實施例中實現(xiàn)Java類文件熱加載流程圖;圖;3B為本發(fā)明實施例中自定義DynamincClassLoader結(jié)構(gòu)示意圖;圖4為本發(fā)明實施例中Web服務(wù)器功能結(jié)構(gòu)示意圖。
具體實施例方式基于Java平臺的Web業(yè)務(wù)系統(tǒng)的動態(tài)升級過程,即是Web業(yè)務(wù)系統(tǒng)內(nèi)運(yùn)行的Java 類文件的熱替換過程,本發(fā)明實施例中,重寫了類加載方法,即重新定義了 Java類文件的 加載方式,實現(xiàn)Java類文件(如,Jar包)的動態(tài)加載,具體為新建一個自定義的類加載 器,令新建的類加載器繼承指定的父類加載器,且將該父類加載器設(shè)置為空值,再采用新建 的類加載器在預(yù)設(shè)存儲位置加載至少一個Java類文件,并采用加載Java類文件后的類加 載器替換Java平臺內(nèi)核中指定的已加載的類加載器。下面結(jié)合附圖對本發(fā)明優(yōu)選的實施方式進(jìn)行詳細(xì)說明?;贘ava平臺的Web業(yè)務(wù)系統(tǒng)內(nèi),所有的Java類文件在加載的時候,都是通過內(nèi) 置的類加載器(ClassLoader)來實現(xiàn)加載工作的,ClassLoader加載過程本身具有一定的
1 Bf以 BootStrapClassLoader>ExtClassLoader>AppClassLoader 以及用戶自定義的CustomClassLoader,這四種類加載器為例,這四種類加載器分別負(fù)責(zé)不 同路徑的Java類文件的加載,并形成了一個類加載器的層次結(jié)構(gòu)BootStrapClassLoader處于類加載器層次結(jié)構(gòu)的最高層,負(fù)責(zé)Sun. boot, class, path路徑下Java類文件的加載,默認(rèn)為jre/lib目錄下的核心API (應(yīng)用程序接口) 或-Xbootclasspath選項指定的Java類文件。ExtClassLoader處于類加載器層次結(jié)構(gòu)的次高層,負(fù)責(zé)java. ext. dirs路徑下的 Java類文件的加載,默認(rèn)為jre/lib/ext目錄或者-D java. ext. dirs指定目錄下的Java類 文件;AppClassLoader處于類加載器層次結(jié)構(gòu)的次低層,負(fù)責(zé)java. class, path下Java 類文件的加載,默認(rèn)為環(huán)境變量CLASSPATH中設(shè)定的值。用戶自定義CustomClassLoader處于類加載器層次結(jié)構(gòu)的最低層,可以根據(jù)用戶 的需要定制自己的類加載過程,在運(yùn)行期進(jìn)行指定Java類文件的動態(tài)實時加載。參閱圖2所示,上述四種類加載器形成一定的父子關(guān)系,高層為低層的父加載器, 在進(jìn)行Java類文件的加載時,系統(tǒng)首先會在類加載器層次結(jié)果中自底向上挨個檢查是否 已經(jīng)加載了指定的Java類文件,如果已經(jīng)加載則直接返回該Java類文件的引用,如果檢 查到最高層也沒有加載過指定的Java類文件,那么系統(tǒng)會自頂向下逐個嘗試加載指定的 Java類文件,直到檢索到用戶自定義的類加載器CustomClassLoader,如果還不能加載成 功,就會出現(xiàn)異常。同一個類加載器實例而言,名字相同的Java類文件只能存在一個,并且僅能加載 一次,不管該Java類文件有沒有變化,下次再需要加載時,只能從自身的緩存中直接返回 已經(jīng)加載過的Java類文件的引用。
5
基于上述原理,參閱圖3A所示,本發(fā)明實施例中,實現(xiàn)Java類文件熱加載的詳細(xì) 流程如下步驟300 新建一個自定義的類加載器。參閱圖IBB所示,本實施例中,將新建的自定義的類加載器命名為 DynamicClassLoadero步驟310 令新建的類加載器繼承指定的父類加載器,且將父類加載器設(shè)置為空 值,即null值。所謂繼承,是指將已存在的類加載器包含的方法及屬性作為基礎(chǔ)來建立新的類加 載器,新建立的類加載可以使用被繼承的類加載器包含的全部方法及屬性,還可以擴(kuò)展新 的方法及屬性,采用繼承這種技術(shù)使得復(fù)用以前的代碼非常容易,能夠大大縮短開發(fā)周期, 降低開發(fā)費(fèi)用。參閱圖;3B所示,本實施例中,DynamicClassLoader繼承的指定的父類加載器為 CustomClassLoader,并將CustomClassLoade的取值設(shè)置為null值,這樣,可以改變原始的 加載順序,即原先由父類加載器先加載Java類文件,再由子類加載器加載Java文件,改為 先由子加載器加載Java類文件,再由父類加載器加載Java類文件,從而將原始的類加載順 序修改成為自定義的類加載順序。步驟320 采用新建的類加載器加載指定存儲位置的至少一個Java類文件。本實施例中,執(zhí)行步驟320時,包括將新建的類加載器的加載路徑設(shè)置為自定義的存儲路徑,判斷是否該類已經(jīng)加載 過,這需要通過調(diào)用findLoadedClass方法來實現(xiàn);將新建的類加載器實例化,這需要通過調(diào)用defineClass方法來實現(xiàn),通常 將以字節(jié)數(shù)組表示的類字節(jié)碼,轉(zhuǎn)換成Class實例,從而完成類加載器的實例化;調(diào)用 defineClass方法的實現(xiàn)代碼如下private Class instantiateClass(String name, InputStream fin, long len){byte [] raw = new byte [ (int) len];fin. read (raw);fin. close ();return defineClass (name, raw, O, raw. length);}設(shè)置新建的類加載器的加載行為,令新建的類加載器在自定義的存儲路徑上加載
該存儲路徑上保存的至少一個Java類文件,這需要通過調(diào)用resolveClass方法來實現(xiàn)。
運(yùn)行實例化后的新建的類加載器,從而實現(xiàn)在指定的存儲路徑上的Java類文件 的加載,這需要通過重寫loadClass方法來實現(xiàn),重寫loadClass方法的實現(xiàn)代碼如下protected Class loadClass(String name, boolean resolve)throws ClassNotFoundException{Class cls = null ;cls = findLoadedClass(name);if ( ! this, dynaclazns. contains (name) &&cls == null)cls = getSystemClassLoader(). loadClass (name);
if (cls = = null)throw new ClassNotFoundException(name); if (resolve)resolveClass(cls); return cls ;}步驟330 采用加載Java類文件后的類加載器替換Java平臺內(nèi)核中指定的已加 載的類加載器。執(zhí)行步驟330時,需要改變Web服務(wù)器中的Java平臺的類加載方式,令Web服務(wù) 器將加載Java類文件后的類加載器重載至的Java平臺內(nèi)核中,替換Java平臺內(nèi)核中指定 的已加載的類加載器,從而完成了 Java類文件的熱替換。每一種Web服務(wù)器上運(yùn)行的Java平臺都有自身的類加載方式,以Web服務(wù)器是 Tomcat krver為例,Tomcat krver在啟動的時候?qū)?gòu)造一個類加載器樹,假設(shè)其層次和
M BootStrapClassLoader- > SystemClassLoader- > CommonClassLoader- > CatalinaClassLoader- > Shared ClassLoader- > Web 應(yīng)用禾呈序 WebappXClassLoader (用
于加載Web應(yīng)用程序的類加載器)。BootStrapClassLoader,用于加載Java平臺提供的基本的運(yùn)行時間類文件,加上 在 System Extensions 目錄($JAVA_H0ME/jre/lib/ext)里的 JAR 文件中所有的 Java 類文 件和資源;SystemClassLoader,用于加載CLASSPATH環(huán)境變量配置路徑的Java類文件和資 源;CommonClassLoader,用于加載"Tomcat服務(wù)器本身和所有的Web應(yīng)用都能搜索到 的Java類文件,即也就common目錄下面的Java類文件和資源;CatalinaClassLoader,用于加載所有的在 $CATALINA_HOME/server/classes 里 未包裝的Java類文件和資源;SharedClassLoader,用于加載所有的在 $CATALINA_BASE/shared/classes 里包 裝的Java類文件和資源;WebappXClassLoader, 一種Web應(yīng)用程序加載類,用于加載在/WEB-INF/ classes目錄里所有的未包裝的Java類和資源,對每個Tomcat krver里的Web應(yīng)用 都創(chuàng)建一個 WebappXClassLoader, Web 應(yīng)用下的 WEB-INF/classes,WEB-INF/lib 都由 WebappXClassLoader加載,它所加載的Java類文件對其他的Web應(yīng)用是不可見的。如, 某一業(yè)務(wù)系統(tǒng)的應(yīng)用程序組件與包(由多個類文件組成)是安裝在/WEB-INF/classes與 WEB-INF/lib下面的,而WiebappXClassLoader負(fù)責(zé)這個業(yè)務(wù)系統(tǒng)的所有應(yīng)用程序組件與包 的加載。從上可知,要想改變Web服務(wù)器上Java平臺的類加載方式,就需要改造 WebappXClassLoader 的力口載方式,艮改造Tomcat Server 的 webappClassLoader 類,具體的 步驟如下將新建的已加載了 Java類文件的類加載器DynamicClassLoader,作為 webappClassLoader Ι^ ^Μ 生;
7
添加重建方法,令Tomcat Server在重新加載時,采用重載的類加載器 DynamicClassLoader,替換掉Java平臺內(nèi)核中指定的已加載的類加載器,這樣,便可以針 對任意一個Java類文件進(jìn)行熱替換,其實現(xiàn)代碼如下public void reCreateDynamicClassLoader(){dynamicClassLoader = new DynamicClassLoader(this);}修改findClass方法,由于外層升級類組件需要調(diào)用webappClassLoader類中的 findClass方法實現(xiàn)動態(tài)升級類組件,而findClass方法默認(rèn)是不能被外部類訪問的,所以 修改findClass方法前面的屬性關(guān)鍵字,將findClass方法屬性修改成為public,添加相關(guān) 的代碼,從而將重建的屬性加入相關(guān)的地方。具體流程為在iTomcat內(nèi)核中,打開webappClassLoader. java類文件修改在第832行(僅為舉例),公開findClass方法public Class findClass(String name)throws ClassNotFoundException{第1569行(僅為舉例),添加如下一行代碼。if(isReload)removeResourceEntry(name);第1577行(僅為舉例),if ((entry == null) | | (entry. binaryContent == null))改為if ((entry = = null) | | (entry. IoadedClass = = nullMentry. binaryContent ==null))第I633 I636行(僅為舉例)if (entry. IoadedClass == null) {clazz = defineClass(name, entry. binaryContent,O, entry. binaryContent. length, codeSource);改為byte[]classData = new byte[entry. binaryContent. length];System, arraycopy (entry. binaryContent, O, classData,0,classData. length);if (entry. IoadedClass == null) {clazz = isReload ? dynamicClassLoader.IoadClass(name, classData, codeSource) :defineClass(name, classData,O, classData. length, codeSource);基于上述實施例,參閱圖4所示,基于Java平臺的Web服務(wù)器包括建立單元40、第 一加載單元41和第二加載單元42,其中,建立單元40,用于新建一個自定義的類加載器,令新建的類加載器繼承指定的父 類加載器,且將該父類加載器設(shè)置為空值;第一加載單元41,用于采用新建的類加載器在預(yù)設(shè)存儲位置加載至少一個Java 類文件;第二加載單元42,采用加載Java類文件后的類加載器替換Java平臺內(nèi)核中指定 的其他類加載器。
綜上所述,本發(fā)明實施例中,管理人員只需要采用自定義的類加載器加載指定位 置的Java類文件,并采用加載Java類文件后的類加載器替換Java平臺內(nèi)核中指定的類加 載器,即可采用升級后的Java類文件直接替換原有的Java類文件,從而實現(xiàn)了 Web業(yè)務(wù)系 統(tǒng)的動態(tài)升級,不需要重啟Web服務(wù)器,也不需要中斷Web業(yè)務(wù)服務(wù),從而保證了 Web業(yè)務(wù) 的連續(xù)性,提高了 Web業(yè)務(wù)系統(tǒng)的性能和服務(wù)質(zhì)量。顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進(jìn)行各種改動和變型而不脫離本發(fā)明的精 神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍 之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。
權(quán)利要求
1.一種基于Java平臺的Web業(yè)務(wù)系統(tǒng)動態(tài)升級方法,其特征在于,包括新建一個自定義的類加載器,令新建的類加載器繼承指定的父類加載器,且將所述父 類加載器設(shè)置為空值;采用所述新建的類加載器在預(yù)設(shè)存儲位置加載至少一個Java類文件; 采用加載Java類文件后的類加載器替換Java平臺內(nèi)核中指定的已加載的類加載器。
2.如權(quán)利要求1所述的方法,其特征在于,采用所述新建的類加載器在預(yù)設(shè)存儲位置 加載至少一個Java類文件,包括將新建的類加載器的加載路徑設(shè)置為自定義的存儲路徑; 將所述新建的類加載器實例化;設(shè)置所述新建的類加載器的加載行為,令所述類加載器加載在自定義的存儲路徑上保 存的Java類文件;運(yùn)行實例化后的新建的類加載器。
3.如權(quán)利要求1或2所述的方法,其特征在于,采用加載Java類文件后的類加載器替 換Java平臺內(nèi)核中指定的已加載的類加載器,包括將所述加載Java類文件后的類加載器設(shè)置為Web應(yīng)用程序加載類的成員屬性; 將所述加載Java類文件后的類加載器加載至Java平臺內(nèi)核中,替換Java平臺內(nèi)核中 指定的已加載的類加載器。
4.如權(quán)利要求3所述的方法,其特征在于,所述新建的類加載器繼承的指定的父類加 CustomClassLoader0
5.如權(quán)利要求3所述的方法,其特征在于,所述Web應(yīng)用程序加載類為 WebappXClassLoaderο
6.一種基于Java平臺的Web業(yè)務(wù)系統(tǒng)動態(tài)升級裝置,其特征在于,包括建立單元,用于新建一個自定義的類加載器,令新建的類加載器繼承指定的父類加載 器,且將所述父類加載器設(shè)置為空值;第一加載單元,用于采用所述新建的類加載器在預(yù)設(shè)存儲位置加載至少一個Java類 文件;第二加載單元,采用加載Java類文件后的類加載器替換Java平臺內(nèi)核中指定的其他 類加載器。
7.如權(quán)利要求6所述的裝置,其特征在于,所述第一加載單元采用所述新建的類加載 器在預(yù)設(shè)存儲位置加載至少一個Java類文件,包括將新建的類加載器的加載路徑設(shè)置為自定義的存儲路徑; 將所述新建的類加載器實例化;設(shè)置所述新建的類加載器的加載行為,令所述類加載器加載在自定義的存儲路徑上保 存的Java類文件;運(yùn)行實例化后的新建的類加載器。
8.如權(quán)利要求6或7所述的裝置,其特征在于,所述第二加載單元采用加載Java類文 件后的類加載器替換Java平臺內(nèi)核中指定的已加載的類加載器,包括將所述加載Java類文件后的類加載器設(shè)置為Web應(yīng)用程序加載類的成員屬性; 將所述加載Java類文件后的類加載器加載至Java平臺內(nèi)核中,替換Java平臺內(nèi)核中指定的已加載的類加載器。
9.如權(quán)利要求8所述的裝置,其特征在于,所述第一加載單元令新建的類加載器繼承 的指定的父類加載器,包括令新建的類加載器繼承CustomClassLoader。
10.如權(quán)利要求8所述的裝置,其特征在于,所述第二加載單元將所述加載Java類文件 后的類加載器設(shè)置為Web應(yīng)用程序加載類的成員屬性,包括將加載Java類文件后的類加 載器設(shè)置為WebappXClassLoader的成員屬性。
全文摘要
本發(fā)明涉及計算機(jī)領(lǐng)域,公開了一種基于Java平臺的Web業(yè)務(wù)系統(tǒng)動態(tài)升級方法及裝置,用以在不中斷Web業(yè)務(wù)的前提下,實現(xiàn)Web業(yè)務(wù)系統(tǒng)的動態(tài)升級。該方法為采用自定義的類加載器加載指定位置的Java類文件,并采用加載Java類文件后的類加載器替換Java平臺內(nèi)核中指定的類加載器,這樣,即可采用升級后的Java類文件直接替換原有的Java類文件,從而實現(xiàn)了Web業(yè)務(wù)系統(tǒng)的動態(tài)升級,不需要重啟Web服務(wù)器,也不需要中斷Web業(yè)務(wù)服務(wù),從而保證了Web業(yè)務(wù)的連續(xù)性,提高了Web業(yè)務(wù)系統(tǒng)的性能和服務(wù)質(zhì)量。
文檔編號G06F9/445GK102073525SQ20111002344
公開日2011年5月25日 申請日期2011年1月20日 優(yōu)先權(quán)日2011年1月20日
發(fā)明者毛潤 申請人:中興通訊股份有限公司