本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域,尤其涉及一種基于運(yùn)行時(shí)上下文的出站式服務(wù)方法及系統(tǒng)。
背景技術(shù):在出站式服務(wù)架構(gòu)中,由控制端指令計(jì)算節(jié)點(diǎn)執(zhí)行數(shù)據(jù)服務(wù),一種典型的通信模型的主要過程如下:將分布式服務(wù)程序分別部署在每個(gè)計(jì)算節(jié)點(diǎn)中,分布式服務(wù)程序中包含必要的服務(wù)過程;計(jì)算節(jié)點(diǎn)回連控制端,控制端進(jìn)行必要的身份驗(yàn)證后,維持此連接作為主連接;控制端通過主連接分化出新會話連接,并通過會話連接指示計(jì)算節(jié)點(diǎn)進(jìn)行數(shù)據(jù)計(jì)算和結(jié)果回傳。在這種模型中,需要解決兩個(gè)問題:一、計(jì)算節(jié)點(diǎn)服務(wù)升級:當(dāng)計(jì)算節(jié)點(diǎn)需要更新服務(wù)時(shí),傳統(tǒng)的做法是通過升級程序或手動將計(jì)算節(jié)點(diǎn)的服務(wù)程序更新,重啟計(jì)算節(jié)點(diǎn)服務(wù)程序,再次回連。升級過程不夠靈活。二、計(jì)算節(jié)點(diǎn)和控制端的資源管理問題:當(dāng)計(jì)算服務(wù)所處的會話異常結(jié)束,例如網(wǎng)絡(luò)斷開時(shí),需要處理資源釋放問題。專利申請?zhí)枮镃N201210521645的文獻(xiàn)披露了一種基于BOOST的出站式RFI/RMI服務(wù)實(shí)現(xiàn)方法及通信系統(tǒng),其使用遠(yuǎn)程對象作為會話資源管理器,使用會話式契約(RMI服務(wù))來管理資源,在這種模式下,每種服務(wù)會話需要獨(dú)立定義會話對象及契約接口,當(dāng)基于會話的服務(wù)種類增多時(shí),會增大控制端和計(jì)算節(jié)點(diǎn)的耦合度。
技術(shù)實(shí)現(xiàn)要素:為解決上述問題,本發(fā)明采用的一個(gè)技術(shù)方案是:提供一種基于運(yùn)行時(shí)上下文的出站式服務(wù)實(shí)現(xiàn)系統(tǒng),包括控制端以及與控制端通信連接的至少一個(gè)計(jì)算節(jié)點(diǎn),所述計(jì)算節(jié)點(diǎn)包括主連接發(fā)起模塊、功能模塊加載模塊、計(jì)算模塊,所述控制端包括驗(yàn)證模塊、主連接模塊、查詢模塊、判斷模塊、更新模塊、會話模塊;所述主連接發(fā)起模塊用于向控制端發(fā)起連接;所述驗(yàn)證模塊用于對發(fā)起連接的計(jì)算節(jié)點(diǎn)進(jìn)行身份驗(yàn)證;所述主連接模塊用于當(dāng)驗(yàn)證模塊對計(jì)算節(jié)點(diǎn)身份驗(yàn)證通過后,維持所述連接作為主連接,并創(chuàng)建進(jìn)程上下文,進(jìn)程上下文中包含服務(wù)函數(shù)表,服務(wù)函數(shù)表中注冊有功能模塊對應(yīng)的服務(wù)函數(shù);所述查詢模塊用于通過主連接查詢計(jì)算節(jié)點(diǎn)現(xiàn)有功能模塊的類別和版本號;所述判斷模塊用于根據(jù)所述類別和版本號判斷計(jì)算節(jié)點(diǎn)現(xiàn)有功能模塊中是否有未更新的功能模塊,并當(dāng)判定沒有未更新的功能模塊時(shí),通知計(jì)算節(jié)點(diǎn)加載功能模塊;所述更新模塊用于當(dāng)判斷模塊判定有未更新的功能模塊時(shí),通過主連接對未更新的功能模塊相應(yīng)的服務(wù)函數(shù)進(jìn)行更新,然后通知計(jì)算節(jié)點(diǎn)加載功能模塊;所述功能模塊加載模塊用于加載功能模塊;所述會話模塊用于通過主連接與計(jì)算節(jié)點(diǎn)進(jìn)行會話連接;所述計(jì)算模塊用于根據(jù)會話連接的指示進(jìn)行數(shù)據(jù)計(jì)算并將結(jié)果回傳。本發(fā)明采用的另一個(gè)技術(shù)方案是:提供一種基于運(yùn)行時(shí)上下文的出站式服務(wù)實(shí)現(xiàn)方法,包括:S101、計(jì)算節(jié)點(diǎn)向控制端發(fā)起連接;S102、控制端對發(fā)起連接的計(jì)算節(jié)點(diǎn)進(jìn)行身份驗(yàn)證后,維持所述連接作為主連接,并創(chuàng)建進(jìn)程上下文,進(jìn)程上下文中包含服務(wù)函數(shù)表,服務(wù)函數(shù)表中注冊有功能模塊對應(yīng)的服務(wù)函數(shù);S103、控制端通過主連接查詢計(jì)算節(jié)點(diǎn)現(xiàn)有功能模塊的類別和版本號,并根據(jù)所述類別和版本號判斷計(jì)算節(jié)點(diǎn)現(xiàn)有功能模塊中是否有未更新的功能模塊,若是,進(jìn)入步驟S104,若否,進(jìn)入步驟S105;S104、控制端通過主連接對未更新的功能模塊相應(yīng)的服務(wù)函數(shù)進(jìn)行更新;S105、計(jì)算節(jié)點(diǎn)加載功能模塊,然后進(jìn)入步驟S106;S106、控制端通過主連接與計(jì)算節(jié)點(diǎn)進(jìn)行會話連接,并通過會話連接指示計(jì)算節(jié)點(diǎn)進(jìn)行數(shù)據(jù)計(jì)算和結(jié)果回傳。本發(fā)明的種基于運(yùn)行時(shí)上下文的出站式服務(wù)實(shí)現(xiàn)方法及系統(tǒng),基于RFI服務(wù)模型,使用進(jìn)程運(yùn)行時(shí)上下文實(shí)現(xiàn)服務(wù)功能模塊的自動更新,使更新過程自動化,并在大部分場合下不需要重啟服務(wù)程序,提高了升級維護(hù)的效率;使用線程上下文管理會話資源,省去了會話對象的定義及對象接口契約設(shè)計(jì),提高了開發(fā)效率并降低通信雙方的耦合度。事實(shí)上,在其他很多應(yīng)用場合,恰當(dāng)使用運(yùn)行時(shí)上下文可以降低程序耦合度,例如實(shí)現(xiàn)進(jìn)程級的單例、增強(qiáng)的線程局部存儲等。附圖說明圖1是本發(fā)明一實(shí)施方式中一種基于運(yùn)行時(shí)上下文的出站式服務(wù)實(shí)現(xiàn)系統(tǒng)的系統(tǒng)架構(gòu)圖;圖2是計(jì)算節(jié)點(diǎn)的結(jié)構(gòu)框圖;圖3是控制端的結(jié)構(gòu)框圖;圖4是計(jì)算模塊的功能模塊圖;圖5是上下文類定義的示意圖;圖6是上下文載體的類定義圖;圖7是本發(fā)明一實(shí)施方式中一種基于運(yùn)行時(shí)上下文的出站式服務(wù)實(shí)現(xiàn)方法的執(zhí)行流程圖。主要元件符號說明基于運(yùn)行時(shí)上下文的出站式服務(wù)實(shí)現(xiàn)系統(tǒng)100;控制端10;計(jì)算節(jié)點(diǎn)20;主連接發(fā)起模塊21;功能模塊加載模塊22;計(jì)算模塊23;驗(yàn)證模塊11;主連接模塊12;查詢模塊13;判斷模塊14;更新模塊15;會話模塊16;線程創(chuàng)建子模塊231;綁定子模塊232;線程退出子模塊233。具體實(shí)施方式為詳細(xì)說明本發(fā)明的技術(shù)內(nèi)容、構(gòu)造特征、所實(shí)現(xiàn)目的及效果,以下結(jié)合實(shí)施方式并配合附圖詳予說明。請參閱圖1,是本發(fā)明一實(shí)施方式中一種基于運(yùn)行時(shí)上下文的出站式服務(wù)實(shí)現(xiàn)系統(tǒng)的系統(tǒng)架構(gòu)圖。該基于運(yùn)行時(shí)上下文的出站式服務(wù)實(shí)現(xiàn)系統(tǒng)100包括控制端10以及與控制端通信連接的至少一個(gè)計(jì)算節(jié)點(diǎn)20。請一并參閱圖2、圖3,圖2是計(jì)算節(jié)點(diǎn)的結(jié)構(gòu)框圖,圖3是控制端的結(jié)構(gòu)框圖。所述計(jì)算節(jié)點(diǎn)20包括主連接發(fā)起模塊21、功能模塊加載模塊22、計(jì)算模塊23。所述控制端10包括驗(yàn)證模塊11、主連接模塊12、查詢模塊13、判斷模塊14、更新模塊15、會話模塊16。所述主連接發(fā)起模塊21用于向控制端10發(fā)起連接。所述驗(yàn)證模塊11用于對發(fā)起連接的計(jì)算節(jié)點(diǎn)20進(jìn)行身份驗(yàn)證。所述主連接模塊12用于當(dāng)驗(yàn)證模塊11對計(jì)算節(jié)點(diǎn)20身份驗(yàn)證通過后,維持所述連接作為主連接,并創(chuàng)建進(jìn)程上下文,進(jìn)程上下文中包含服務(wù)函數(shù)表,服務(wù)函數(shù)表中注冊有功能模塊對應(yīng)的服務(wù)函數(shù)。其中,在RFI調(diào)用模型基礎(chǔ)上,本發(fā)明將服務(wù)集合分類整合到不同的功能模塊中,每個(gè)模塊具有版本號、類別信息。在模塊的入口處注冊服務(wù)函數(shù)至服務(wù)函數(shù)表中,服務(wù)函數(shù)表保存了每一個(gè)服務(wù)函數(shù)的ID和對應(yīng)的服務(wù)函數(shù),其定義如下:Map<FunctionKey,FunctionAgent>所述服務(wù)函數(shù)表設(shè)置在進(jìn)程上下文中,所以整個(gè)進(jìn)程都可以訪問。所述查詢模塊13用于通過主連接查詢計(jì)算節(jié)點(diǎn)20現(xiàn)有功能模塊的類別和版本號。所述判斷模塊14用于根據(jù)所述類別和版本號判斷計(jì)算節(jié)點(diǎn)20現(xiàn)有功能模塊中是否有未更新的功能模塊,并當(dāng)判定沒有未更新的功能模塊時(shí),通知計(jì)算節(jié)點(diǎn)20加載功能模塊。所述更新模塊15用于當(dāng)判斷模塊判定有未更新的功能模塊時(shí),通過主連接對未更新的功能模塊相應(yīng)的服務(wù)函數(shù)進(jìn)行更新,然后通知計(jì)算節(jié)點(diǎn)20加載功能模塊。具體地,新的服務(wù)函數(shù)將替換舊的服務(wù)代理函數(shù),在以后的會話將自動使用新服務(wù)函數(shù),不必重新啟動計(jì)算節(jié)點(diǎn)服務(wù)程序。更新服務(wù)過程本身也是一個(gè)會話服務(wù),為了避免更新服務(wù)與其他會話請求造成訪問沖突,更新服務(wù)過程必須由主連接完成。所述功能模塊加載模塊22用于加載功能模塊。所述會話模塊16用于通過主連接與計(jì)算節(jié)點(diǎn)20進(jìn)行會話連接。所述計(jì)算模塊23用于根據(jù)會話連接的指示進(jìn)行數(shù)據(jù)計(jì)算并將結(jié)果回傳。請參閱圖4,是計(jì)算模塊的功能模塊圖。所述計(jì)算模塊23具體包括線程創(chuàng)建子模塊231、綁定子模塊232、線程退出子模塊233。線程創(chuàng)建子模塊231用于當(dāng)計(jì)算節(jié)點(diǎn)20接收到控制端10發(fā)起的會話服務(wù)后,與控制端建立會話連接,并創(chuàng)建與會話連接惟一對應(yīng)的線程上下文。綁定子模塊232用于當(dāng)計(jì)算節(jié)點(diǎn)20接收到控制端發(fā)送的打開文件指令后,將文件句柄與線程上下文綁定,并返回文件句柄ID至控制端10;線程退出子模塊233用于當(dāng)計(jì)算節(jié)點(diǎn)20偵測到會話結(jié)束條件滿足時(shí),退出線程并關(guān)閉文件句柄。其中,所述會話結(jié)束的條件包括正常終止、網(wǎng)絡(luò)異常退出、服務(wù)異常退出。自動關(guān)閉句柄可以由上下文對象或析構(gòu)行為實(shí)現(xiàn),在windows中,句柄屬于內(nèi)核對象,通過統(tǒng)一的API可關(guān)閉不同類型的句柄,因此自動關(guān)閉柄的功能策略在某種程度上簡化了句柄資源的管理。運(yùn)行上下文通過調(diào)用子類的獲取上下文方法,訪問子類上下文對象。無論會話以何種形式終止,文件都會被釋放。下面是打開文件是將文件句柄綁定到線程上下文的偽代碼。其中ThreadRuntimeContext是線程上下文,通過靜態(tài)函數(shù)將文件句柄注冊到上下文載體中,因此文件句柄在線程退出時(shí)會自動釋放。對于其他非句柄資源,也可以通過queue_exit_handler自定義退出操作,類似于異常處理中的final塊。請參閱圖5,是上下文類定義的示意圖。圖中GenericRuntimeContext是運(yùn)行時(shí)上下文的基類,封裝了以下操作:基類通過get_context獲取子類的上下文載體,進(jìn)程上下文子類的上下文載體生存周期是應(yīng)用程序的整個(gè)運(yùn)行期,訪問域是進(jìn)程域;線程上下文子類的上下文載體的生存周期是每個(gè)線程的運(yùn)行期,訪問域是線程域,例如線程上下文設(shè)置的變量不能被其他線程訪問。請參閱圖6,是上下文載體的類定義圖。其中values是set_value和get_value訪問的變量表,handlers是queue_exit_handler操作的函數(shù)對象,handles是上下文析構(gòu)是自動關(guān)閉的句柄,section是限制訪問競爭的信號量。在上下文析構(gòu)時(shí),變量表中的所有變量會被釋放,對象的析構(gòu)函數(shù)會被調(diào)用;析構(gòu)操作會被依次調(diào)用,句柄會被依次關(guān)閉。對于線程上下文,信號量是空類型,及信號量不存在鎖和解鎖的操作,因?yàn)橥瑐€(gè)線程中不可能出現(xiàn)訪問競爭。運(yùn)行時(shí)對象最關(guān)鍵的部分是上下文載體何時(shí)創(chuàng)建和釋放。在實(shí)現(xiàn)上,進(jìn)程上下文在第一次執(zhí)行上下文操作時(shí)創(chuàng)建上下文載體,線程上下文則在每個(gè)線程第一次執(zhí)行上下文操作時(shí)創(chuàng)建上下文載體,這不影響使用邏輯。進(jìn)程上下文不同于單例,單例一般是運(yùn)行模塊內(nèi)的單例,是語言級的。當(dāng)一個(gè)進(jìn)程由多個(gè)模塊組成,每個(gè)模塊會對于同一個(gè)類型具有各自的單例,而在RFI模型中,服務(wù)函數(shù)需要注冊在進(jìn)程域的服務(wù)表中,模塊內(nèi)的單例模型不能滿足要求。在Windows中,不存在語言級的進(jìn)程單例,本文使用文獻(xiàn)“ModernC++DesignGenericProgrammingandDesignPatternsApplied,AndreiAlexandrescu”中的環(huán)境變量和鳳凰模式的單例模型實(shí)現(xiàn)進(jìn)程上下文,通過環(huán)境變量訪問上下文載體單例的地址,第一次訪問時(shí),由于環(huán)境變量不存在,需要?jiǎng)?chuàng)建單例并注冊單例的地址到環(huán)境變量中。上述基于線程上下文的會話模型,省去了對象接口契約,但要求每個(gè)會話服務(wù)對應(yīng)于計(jì)算節(jié)點(diǎn)的一個(gè)線程,即當(dāng)控制端發(fā)起一個(gè)會話服務(wù)時(shí),要求計(jì)算節(jié)點(diǎn)創(chuàng)建一個(gè)新線程和一個(gè)新連接,在該線程和連接中處理會話過程中的所有服務(wù)請求,與此同時(shí),服務(wù)節(jié)點(diǎn)在該線程中使用的文件或其他資源,將通過服務(wù)函數(shù)綁定到線程上下文中。當(dāng)會話連接以任何形式終止時(shí),線程將自動退出,而會話過程中,服務(wù)函數(shù)產(chǎn)生的異常使線程退出時(shí),也同時(shí)終止會話連接,線程和會話連接的生命期是一致的。請參閱圖7,是本發(fā)明一實(shí)施方式中一種基于運(yùn)行時(shí)上下文的出站式服務(wù)實(shí)現(xiàn)方法的執(zhí)行流程圖,該方法運(yùn)行于所述基于運(yùn)行時(shí)上下文的出站式服務(wù)實(shí)現(xiàn)系統(tǒng)100中,該方法包括如下步驟:步驟S101、計(jì)算節(jié)點(diǎn)向控制端發(fā)起連接;步驟S102、控制端對發(fā)起連接的計(jì)算節(jié)點(diǎn)進(jìn)行身份驗(yàn)證后,維持所述連接作為主連接,并創(chuàng)建進(jìn)程上下文,進(jìn)程上下文中包含服務(wù)函數(shù)表,服務(wù)函數(shù)表中注冊有功能模塊對應(yīng)的服務(wù)函數(shù);其中,在RFI調(diào)用模型基礎(chǔ)上,本發(fā)明將服務(wù)集合分類整合到不同的功能模塊中,每個(gè)模塊具有版本號、類別信息。在模塊的入口處注冊服務(wù)函數(shù)至服務(wù)函數(shù)表中,服務(wù)函數(shù)表保存了每一個(gè)服務(wù)函數(shù)的ID和對應(yīng)的服務(wù)函數(shù),其定義如下:Map<FunctionKey,FunctionAgent>所述服務(wù)函數(shù)表設(shè)置在進(jìn)程上下文中,所以整個(gè)進(jìn)程都可以訪問。步驟S103、控制端通過主連接查詢計(jì)算節(jié)點(diǎn)現(xiàn)有功能模塊的類別和版本號,并根據(jù)所述類別和版本號判斷計(jì)算節(jié)點(diǎn)現(xiàn)有功能模塊中是否有未更新的功能模塊,若是,進(jìn)入步驟S104,若否,進(jìn)入步驟S105;步驟S104、控制端通過主連接對未更新的功能模塊相應(yīng)的服務(wù)函數(shù)進(jìn)行更新,然后進(jìn)入步驟S105;步驟S105、計(jì)算節(jié)點(diǎn)加載功能模塊,然后進(jìn)入步驟S106;具體地,新的服務(wù)函數(shù)將替換舊的服務(wù)代理函數(shù),在以后的會話將自動使用新服務(wù)函數(shù),不必重新啟動計(jì)算節(jié)點(diǎn)服務(wù)程序。更新服務(wù)過程本身也是一個(gè)會話服務(wù),為了避免更新服務(wù)與其他會話請求造成訪問沖突,更新服務(wù)過程必須由主連接完成。步驟S106、控制端通過主連接與計(jì)算節(jié)點(diǎn)進(jìn)行會話連接,并通過會話連接指示計(jì)算節(jié)點(diǎn)進(jìn)行數(shù)據(jù)計(jì)算和結(jié)果回傳。其中,所述步驟S106具體包括:步驟S1061、計(jì)算節(jié)點(diǎn)當(dāng)接收到控制端發(fā)起的會話服務(wù)后,與控制端建立會話連接,并創(chuàng)建與會話連接惟一對應(yīng)的線程上下文;步驟S1062、計(jì)算節(jié)點(diǎn)當(dāng)接收到控制端發(fā)送的打開文件指令后,將文件句柄與線程上下文綁定,并返回文件句柄ID至控制端;步驟S1063、當(dāng)計(jì)算節(jié)點(diǎn)偵測到會話結(jié)束條件滿足時(shí),退出線程并關(guān)閉文件句柄。所述會話結(jié)束的條件包括正常終止、網(wǎng)絡(luò)異常退出、服務(wù)異常退出。本發(fā)明的種基于運(yùn)行時(shí)上下文的出站式服務(wù)實(shí)現(xiàn)方法及系統(tǒng),基于RFI服務(wù)模型,使用進(jìn)程運(yùn)行時(shí)上下文實(shí)現(xiàn)服務(wù)功能模塊的自動更新,使更新過程自動化,并在大部分場合下不需要重啟服務(wù)程序,提高了升級維護(hù)的效率;使用線程上下文管理會話資源,省去了會話對象的定義及對象接口契約設(shè)計(jì),提高了開發(fā)效率并降低通信雙方的耦合度。事實(shí)上,在其他很多應(yīng)用場合,恰當(dāng)使用運(yùn)行時(shí)上下文可以降低程序耦合度,例如實(shí)現(xiàn)進(jìn)程級的單例、增強(qiáng)的線程局部存儲等。以上所述僅為本發(fā)明的實(shí)施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運(yùn)用在其他相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護(hù)范圍內(nèi)。