本發明涉及數據處理領域,更為具體而言,涉及一種spring應用服務的升級方法和計算機可讀存儲介質。
背景技術:
在相關技術中,常用的升級spring應用服務的做法是重啟服務器。具體而言,重啟服務器的升級方法可包括:停用java應用服務器,部署升級的spring應用服務器,啟動java服務器,讓新部署的javabean生效。
現有的升級重啟服務器的升級方法,存在不少缺點。例如,對于多家單位協同開發的情況,每家單位都有可能更換版本以解決測試問題。每天頻繁地重啟應用服務器,會嚴重影響開發的測試進度和測試效果。而且,對于實時性要求較高的企業(例如,需要提供7*24小時不間斷服務的銀行)而言,更是會影響應用服務器的時效性。而且,對于采用總分模式(例如,總行負責總體框架和公共業務模塊開發,分行負責分行差異化模塊開發)開發的企業而言,如果采用重啟服務器的方式部署新應用,則需要等待統一的時間窗口進行版本上線,這種方式嚴重降低升級和開發效率。
技術實現要素:
為解決上述技術問題,本公開提供了一種spring應用服務的升級方法和計算機可讀存儲介質,能夠在不需要停止spring應用服務器的情況下,升級spring應用服務,從而能夠讓不屬于本次升級范圍內正在運行的spring應用服務不受影響,顯著改善了升級效率。
根據本發明實施方式的第一方面,提供了一種spring應用服務的升級方法,該方法可包括:通過應用上下文管理器接收jar文件的更新請求,判斷所述更新請求對應的jar文件的上下文是否存在,若所述jar文件的上下文不存在,則通知類加載器管理器所述更新請求,由所述類加載器管理器判斷所述更新請求對應的jar文件的類加載器是否存在,若所述jar文件的類加載器不存在,則由類加載器管理器為所述jar文件創建對應的自定義類加載器,并通知所述自定義類加載器加載所述jar文件中的類對象,所述自定義類加載器加載所述jar文件中的類對象,并與當前在用的上下文的類加載器綁定父子關系。
在一些實施方式中,所述方法還包括:通過應用上下文管理器為所述jar文件創建上下文,以便將所創建的上下文與當前在用的上下文的類加載器綁定父子關系。
在一些實施方式中,所述方法還包括:將所述自定義類加載器設置為應用上下文的類加載器,并刷新應用上下文,以便加載所述jar文件中的javabean。
在一些實施方式中,所述方法還包括:若所述jar文件的上下文存在,則卸載所述jar文件的上下文。
在一些實施方式中,所述方法還包括:若所述jar文件的類加載器存在,則通知該已存在的類加載器關閉,并釋放該存在的類加載器。
在一些實施方式中,所述方法還包括:當有應用需要更新時,調用更新jar文件服務接收上傳的更新的jar文件,jar文件服務接收完jar文件后,通知所述應用上下文管理器所述jar文件的更新請求。
根據本發明實施方式的第二方面,提供了一種計算機可讀存儲介質,其上存儲有計算機程序,所述程序被處理器執行時實現:通過應用上下文管理器接收jar文件的更新請求,判斷所述更新請求對應的jar文件的上下文是否存在,若所述jar文件的上下文不存在,則通知類加載器管理器所述更新請求,由所述類加載器管理器判斷所述更新請求對應的jar文件的類加載器是否存在,若所述jar文件的類加載器不存在,則由類加載器管理器為所述jar文件創建對應的自定義類加載器,并通知所述自定義類加載器加載所述jar文件中的類對象,所述自定義類加載器加載所述jar文件中的類對象,并與當前在用的上下文的類加載器綁定父子關系。
實施本發明實施方式提供的spring應用服務的升級方法和計算機可讀存儲介質,能夠在不停用應用服務器的情況下,保證spring應用服務的更新升級,與現有的停用服務器升級的方式相比,能夠不影響不屬于本次升級范圍內、正在運行的spring應用服務,顯著提高spring應用服務升級的效率;而且,由于不影響不屬于本次升級范圍內、正在運行的spring應用服務,也就是說,不會影響協同開發的其他開發方的測試操作,允許各方各自開發自己的javabean并實時生效,在多方協同開發的情形下,能夠從整體上會改善開發和測試的效率。
附圖說明
圖1是根據本發明一種實施方式的spring應用服務的升級方法的流程示意圖。
圖2是根據本發明一種實施方式的spring應用服務的升級方法的流程圖。
具體實施方式
以下結合附圖和具體實施方式對本發明的各個方面進行詳細闡述。其中,眾所周知的模塊、單元及其相互之間的連接、鏈接、通信或操作沒有示出或未作詳細說明。并且,所描述的特征、架構或功能可在一個或一個以上實施方式中以任何方式組合。本領域技術人員應當理解,下述的各種實施方式只用于舉例說明,而非用于限制本發明的保護范圍。還可以容易理解,本文所述和附圖所示的各實施方式中的模塊或單元或處理方式可以按各種不同配置進行組合和設計。
下面對本發明實施方式描述中用到的術語進行簡要說明,需要說明的是,雖然此處對術語進行了解釋,但不應理解為,這些解釋是對這些術語的限制。
java:java是由sunmicrosystems公司于1995年5月推出的java面向對象程序設計語言(以下簡稱java語言)和java平臺的總稱。用于開發internet應用程序。java由四方面組成:java編程語言、java文件格式、java虛擬機(jvm)、java應用程序接口(javaapi)。
java程序:由java源碼(后綴為.java的文件)編譯出來的java字節碼(后綴為.class的文件)。
class:中文名稱:類對象。在java中,每個class都有一個相應的class對象。也就是說,當我們編寫一個類(java源碼),編譯完成后,在生成的.class文件中,就會產生一個class對象,用于表示這個類的類型信息。
java歸檔文件:java歸檔文件有jar(javaarchive中文名稱為jar歸檔文件)、war(webapplicationarchive中文名稱為web應用歸檔文件)、ear(enterprisearchive中文名稱為企業級歸檔文件)等幾種類型,java歸檔文件格式以流行的zip文件格式為基礎,文件名后綴為.jar、.war或.ear。java歸檔文件不僅用于壓縮和發布,而且還用于部署和封裝庫、組件和插件程序。將一個或多個.class文件或其它類型文件(可包含目錄結構)可壓縮為一個java歸檔文件。
jvm:jvm是javavirtualmachine(java虛擬機)的縮寫,jvm是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。jvm執行程序的過程:i.加載.class文件。ii.管理并分配內存。iii.執行垃圾收集。
classloader:classloader(類加載器)用來加載java類到jvm中。與普通程序不同的是java程序并不是本地的可執行程序。當運行java程序時,首先運行jvm,然后再把class類加載到jvm里頭運行,負責加載javaclass的這部分就叫做classloader。
classpath:類路徑。是jvm所需的環境變量,用于告訴jvm從哪些目錄下或者從哪些jar文件中可以找到所要執行的java程序。
j2ee中間件:中間件是一類軟件名,屬基礎軟件和可復用軟件。總的作用是為處于自己上層的應用軟件提供運行與開發的環境幫助用戶開發和集成應用軟件。j2ee中間件特指java應用服務器軟件,常見的產品化的java應用服務器軟件有tomcat、weblogic、websphere等。
java應用服務器:應用服務器主要為應用程序提供運行環境,為組件提供服務。
java應用服務:部署在java應用服務器中,并提供某種服務的java程序。
javabean:一種java語言寫成的可重用組件,本質上是一個java類對象,滿足如下兩個條件:(1)具備無參數構造函數;(2)為成員編寫了set、get方法。
spring框架:spring是一個開源框架,它是為了解決企業應用開發的復雜性而創建的。spring使用基本的javabean來完成以前只可能由ejb(enterprisejavabean)完成的事情。spring框架由七個定義明確的模塊組成,本文涉及的是spring-core與spring-context。
spring-core:spring核心容器是spring框架最基礎的部分,它提供了依賴注入(dependencyinjection)特征來實現容器對bean的管理。
beanfactory:bean工廠。beanfactory是spring應用的核心,是工廠模式的一個實現,它使用ioc將應用配置和依賴說明從實際的應用代碼中分離出來。
spring-context:應用上下文模塊。核心模塊的beanfactory使spring成為一個容器,而應用上下文模塊使它成為一個框架。這個模塊擴展了beanfactory的概念,增加了對國際化(i18n)消息、事件傳播以及驗證的支持。
spring應用服務:部署在spring容器中,并提供某種服務的javabean程序
spring應用服務器:指使用了spring框架的java應用服務器。
本發明實施方式中描述的spring應用服務由一組javabean組成,這些javabean能夠實現特定的業務或技術規則,從而實現特定的業務服務。javabean需要部署在spring應用服務器中。
啟動spring應用服務器時,由java虛擬機的java類加載器從類路徑中加載j2ee中間件軟件以及spring框架,再由spring框架中的應用上下文既在用戶開發的javabean以及開發所引用的第三方(java程序)等。其中,第三方(java程序)一般為jar格式的java歸檔文件。用戶開發的javabean一般為壓縮為一個或多個java歸檔文件。升級spring應用服務,需要把用戶開發的javabean以及第三方(java程序)保存到java應用服務器的java虛擬機能夠識別出的類路徑下。升級操作會修改類路徑下的java程序,需要重新啟動java虛擬機,以保證java類記載其能夠重新加載java程序,讓升級生效。
參見圖1,圖1是根據本發明一種實施方式的spring應用服務的升級方法的流程示意圖,該升級方法可包括:
s101,通過應用上下文管理器接收jar文件的更新請求,判斷所述更新請求對應的jar文件的上下文是否存在,若jar文件的上下文不存在,則執行步驟s102,若jar文件的上下文存在,則執行步驟s103,
s102,通知類加載器管理器所述更新請求,由所述類加載器管理器判斷所述更新請求對應的jar文件的類加載器是否存在,若jar文件的類加載器不存在,則執行步驟s104,若jar文件的類加載器存在,則執行步驟s105,
s103,卸載所述jar文件的上下文,
s104,由類加載器管理器為所述jar文件創建對應的自定義類加載器,并通知所述自定義類加載器加載所述jar文件中的類對象,
s105,通知該已存在的類加載器關閉,并釋放該存在的類加載器,
s106,自定義類加載器加載所述jar文件中的類對象,并與當前在用的上下文的類加載器綁定父子關系。
在本發明的實施方式中,步驟s101中由應用上下文管理器接收jar文件的更新請求,其中,該jar文件可以是通過更新jar文件服務器上傳得到的需要更新的jar文件。當有spring應用需要更新時,調用jar文件服務器接收技術人員上傳的更新的jar文件,更新jar文件服務接收完技術人員上傳的jar文件的更新文件之后,會通知應用上下文管理器有jar文件的更新。
步驟s101中,應用上下文管理器會接收更新jar文件服務發送的更新請求,判斷更新請求中對應的jar文件的上下文是否存在,如果存在,那么說明本次更新的jar文件是對原有的jar文件的更新,那么執行步驟s103,將該jar文件對應的上下文卸載;若不存在,那么說明本次更新的jar文件是全新的jar文件的更新,那么執行步驟s102,通知類加載器管理器jar文件的更新請求,由類加載器管理器判斷該更新請求對應的jar文件的類加載器是否存在,若jar文件的類加載器不存在,那么說明,該jar文件是原來沒有對應的類加載器,則執行步驟s104,由類加載器管理器為該jar文件創建對應的自定義類加載器,并通知該自定義類加載器加載該jar文件中的類對象,若jar文件的類加載器存在,由于存在jar文件的類加載器,需要對其更新,則執行步驟s105,通知該已經存在的類加載器關閉,并釋放該已存在的類加載器。
在步驟s104中,類加載器管理器通知新創建的自定義類加載器加載更新的jar文件中的類對象,在步驟106中,自定義類加載器會根據類加載器管理器的通知加載jar文件中的類對象,并與當前在用的上下文的類加載器綁定父子關系。
在本發明的一些實施方式中,應用上下文管理器使用spring框架的filesystemxmlapplicationcontext類為jar文件創建一個對應的上下文為更新的jar文件創建一個對應的上下文,以便將jar文件新創建的上下文與系統當前在用的上下文的類加載器綁定父子關系。
在本發明的一些實施方式中,在將新創建的jar文件的上下文與系統當前在用的上下文的類加載器綁定父子關系之后,可以將系統的應用上下文的類加載器設置為步驟s104創建的自定義類加載器,并且可以通過刷新應用上下文,以便加載jar文件中的javabean。
在一些實施方式中,spring應用服務的升級方法可以如圖2所示。
(1)當操作員需要升級spring應用服務時,通過調用更新jar文件服務上傳jar文件。
(2)更新jar文件服務接收完更新的jar文件后,通知應用上下文管理器更新。
(3)應用上下文管理器收到更新請求后,首先判斷jar文件對應的上下文是否存在,如果存在,則卸載該jar文件對應的上下文。
(4)如果不存在該jar文件的上下文,則應用上下文管理器通知類加載器管理器更新。
(5)類加載器管理器收到更新請求后,首先判斷請求更新的jar文件所對應的自定義類加載器是否存在,如果存在,則通知該類加載器關閉,然后釋放該類加載器。
(6)自定義類加載器收到關閉請求后,卸載所對應的jar文件。
(7)如果不存在,則類加載器管理器為jar文件創建一個對應的自定義類加載器,并通知該類加載器加載jar文件中的類對象。
(8)自定義類加載器收到加載請求后,加載所指定的jar文件的類對象,并與當前在用的應用上下文的類加載器綁定父子關系。
(9)應用上下文管理器使用spring框架的filesystemxmlapplicationcontext類為jar文件創建一個對應的上下文,然后,與系統當前在用的應用上下文建立父子關系;設置應用上下文的類加載器為第(7)步所創建的類加載器;刷新應用上下文,用來加載jar文件中的javabean。
當java程序需升級jar歸檔文件中的某個javabean時,該java程序調用應用上下文管理器的獲取javabean方法。應用上下文管理器收到請求后,首先判斷jar文件對應的上下文是否存在,如果不存在,則調用更新方法(上面描述的(3)-(9))為jar文件創建一個上下文。應用上下文管理器找到對應的上下文后,調用該上下文的getbean方法,并返回調用所得的javabean。
本發明實施方式提供的spring應用服務的升級方法,首先,能夠在多方協同開發的情形下,保證一方在升級自己開發的應用服務時,不影響其他各方所開發的spring應用服務,從而提高應用服務升級的效率,而且允許各方各自開發自己的javabean,并且能夠實時生效。其次,在升級spring應用服務的同時,不需要停止spring應用服務器,能夠讓不屬于本次升級范圍內的、正在運行的spring應用服務不受影響,對于需要提供連續不間斷服務的情形而言,尤其適用。
本發明實施方式還提供了一種計算機可讀存儲介質,其上存儲有計算機程序,所述程序被處理器執行時可以實現:
通過應用上下文管理器接收jar文件的更新請求,判斷所述更新請求對應的jar文件的上下文是否存在,
若所述jar文件的上下文不存在,則通知類加載器管理器所述更新請求,由所述類加載器管理器判斷所述更新請求對應的jar文件的類加載器是否存在,
若所述jar文件的類加載器不存在,則由類加載器管理器為所述jar文件創建對應的自定義類加載器,并通知所述自定義類加載器加載所述jar文件中的類對象,
所述自定義類加載器加載所述jar文件中的類對象,并與當前在用的上下文的類加載器綁定父子關系。
在一些實施方式中,所述程序被處理器執行時還實現:通過應用上下文管理器為所述jar文件創建上下文,以便將所創建的上下文與當前在用的上下文的類加載器綁定父子關系。
在一些實施方式中,所述程序被處理器執行時還實現:將所述自定義類加載器設置為應用上下文的類加載器,并刷新應用上下文,以便加載所述jar文件中的javabean。
在一些實施方式中,所述程序被處理器執行時還實現:在所述jar文件的上下文存在的情況下,卸載所述jar文件的上下文。
在一些實施方式中,所述程序被處理器執行時還實現:在所述jar文件的類加載器存在的情況下,通知該已存在的類加載器關閉,并釋放該存在的類加載器。
在一些實施方式中,所述程序被處理器執行時還實現:當有應用需要更新時,接收上傳的更新的jar文件,并在jar文件服務接收完jar文件后,通知所述應用上下文管理器所述jar文件的更新請求。
通過以上的實施方式的描述,本領域的技術人員可以清楚地了解到本發明可借助軟件結合硬件平臺的方式來實現。基于這樣的理解,本發明的技術方案對背景技術做出貢獻的全部或者部分可以以軟件產品的形式體現出來,該計算機軟件產品可以存儲在存儲介質中,如rom/ram、磁碟、光盤等,包括若干指令用以使得一臺計算機設備(可以是個人計算機,服務器,智能手機或者網絡設備等)執行本發明各個實施例或者實施例的某些部分所述的方法。
本發明說明書中使用的術語和措辭僅僅為了舉例說明,并不意味構成限定。本領域技術人員應當理解,在不脫離所公開的實施方式的基本原理的前提下,對上述實施方式中的各細節可進行各種變化。因此,本發明的范圍只由權利要求確定,在權利要求中,除非另有說明,所有的術語應按最寬泛合理的意思進行理解。