專利名稱:一種分布式調用消息的方法和裝置的制作方法
技術領域:
本發(fā)明涉及通信技術領域,尤其涉及一種分布式調用消息的方法和裝置。
技術背景軟總線技術提供跨平臺、;夸語言的組件通信能力,解決了系統(tǒng)的分布性、 可擴展性問題,是實現(xiàn)分布式消息處理平臺的基礎。目前業(yè)界比較有影響力的軟總線規(guī)范有3種,分別是公共對象請求代理體系結構(CORBA, Common Object Request Broker Architecture),分布式組件對象模型(DCOM, Distributed Component Object Model)和Java2平臺企業(yè)片反(J2EE, Java 2 Platform, Enterprise Edition)。其中,CORBA是由對象管理組織(OMG, Object Management Government)制定的一種標準的面向對象應用程序的體系規(guī)范。DCOM是由微 軟公司提出的,支持在局域網、廣域網甚至互聯(lián)網上不同計算機的對象之間 的通信。J2EE是SUN公司提出的分布式對象總線標準。以下就以CORBA為 例簡單介紹分布式平臺下調用消息的方式。當一個客戶要使用某個對象實現(xiàn)所提供的服務時,其一般過程如下1) 客戶通過某種方式找到特定對象的對象引用;2) 如果該對象實現(xiàn)有相應的接口定義語言(IDL, Interface Definition Language)存根,則客戶可以通過該IDL存根向對象實現(xiàn)發(fā)出請求,否則,在 接口庫的協(xié)助下,客戶可以使用動態(tài)調用接口來向對象實現(xiàn)發(fā)送請求;3) 當對象調用請求通過IDL存根或動態(tài)調用接口到達對象請求代理 (ORB, Object Request Broker)核心后,ORB核心負責請求的傳送,將其傳送纟會 相應的對象適配器;4) 對象適配器接到該請求后,判斷所請求的對象實現(xiàn)是否有IDL骨架存 在,如果有,則對象適配器通過該IDL骨架調用執(zhí)行對象實現(xiàn)的操作;否則, 對象適配器將通過動態(tài)骨架接口中的動態(tài)實現(xiàn)例程來調用對象實現(xiàn)中的操 作;5)對象實現(xiàn)的特定操作方法體(method)執(zhí)行完成后,結果將按照對象 請求傳遞和執(zhí)行路徑逆向返回給客戶對象,結果可以是輸出參數(shù)、輸入輸出 參數(shù),返回值以及異常信息等。一般來說,分布式調用分為兩種方式異步調用和同步調用。對于異步 調用,調用后不能立即獲得結果,并且不阻塞線程而是繼續(xù)執(zhí)行后續(xù)邏輯。 異步調用適合于不立即關心調用結果或者連續(xù)進行一批不相關調用,以提高 效率。對于同步調用,調用時后續(xù)邏輯被阻塞,直到調用完成獲得結果或調 用超時。通常,開發(fā)者更適應于同步調用,它看起來和本地調用一樣方便,但是 由于分布式遠程調用不可能像本地調用那樣立即獲得結果,而是會阻塞線程 直到得到結果或超時,這勢必影響調用性能。如果想要提高系統(tǒng)的處理性能就需要使用異步調用方式,在定義IDL時 需要定義兩個單向的操作, 一個用于發(fā)起調用, 一個用于發(fā)送結果,分別由 調用雙方實現(xiàn),并被客戶端和服務器端調用。在對現(xiàn)有技術的研究和實踐過程中,發(fā)明人發(fā)現(xiàn)在現(xiàn)有技術中,對于異 步調用,用戶在調用后無法馬上得到返回值,在調用的時候只管調用,對于 調用結果需要在另外一個地方去接收和處理,這種開發(fā)方式在一定程度上打 亂了程序邏輯,增加了開發(fā)的難度和成本,又降低了程序可讀性和可維護性。 對于應用開發(fā)來說,使用同步調用的開發(fā)效率遠比異步方式高,但傳統(tǒng)的分 布式系統(tǒng)的同步調用要求將線程阻塞,對于大并發(fā)量的通信系統(tǒng),有限的線 程資源和高代價的鎖操作會在很大程度上影響處理性能。綜上,在現(xiàn)有技術 的分布式調用消息的方法中,無法兼顧系統(tǒng)處理性能和業(yè)務開發(fā)效率。發(fā)明內容本發(fā)明實施例要解決的技術問題是提供一種分布式調用消息的方法和裝 置,能夠兼顧系統(tǒng)處理性能和業(yè)務開發(fā)效率。為解決上述技術問題,本發(fā)明所提供的分布式調用消息的方法和裝置是 通過以下技術方案實現(xiàn)的本發(fā)明實施例提供了 一種分布式調用消息的方法,該方法包括在方法體內部采用異步方式發(fā)送調用請求消息;保存所述調用請求消息的調用棧信息及運行當前狀態(tài)并退出所述方法體;當接收到所述調用請求消息的應答消息時,恢復保存的所述調用棧信息; 根據恢復的調用棧信息,恢復到退出所述方法體前所處運行當前狀態(tài), 繼續(xù)執(zhí)行后續(xù)邏輯。本發(fā)明實施例提供了一種分布式處理裝置,該裝置包括消息調用單元 和信息處理單元,其中所述消息調用單元包括消息發(fā)送單元、信息存儲單元、棧信息維護單 元、消息接收單元,其中消息發(fā)送單元,在方法體內部采用異步方式發(fā)送調用請求消息;消息接收單元,接收所述調用請求消息的應答消息;信息存儲單元,保存調用棧信息和所述方法體運行當前狀態(tài);棧信息維護單元,當所述消息發(fā)送單元發(fā)送調用請求消息后將所述調用 請求消息的調用棧信息和運行當前狀態(tài)保存到信息存儲單元并退出所述方法 體;在消息接收單元接收到應答消息時,將保存在信息存儲單元的調用棧信 息恢復;信息處理單元,根據棧信息維護單元恢復出的棧信息,恢復到退出所述 方法體前所處運行當前狀態(tài),繼續(xù)執(zhí)行后續(xù)邏輯。從以上技術方案可以看出,本發(fā)明實施例在方法體內部采用異步調用發(fā) 送調用請求消息,在等待應答期間,線程不被堵塞,可以處理別的業(yè)務,因 此可以保證系統(tǒng)的處理性能;同時,當接收到所述調用請求消息的應答消息 時,由于可以通過恢復保存的棧信息直接恢復到退出所述方法體前所處運行 當前狀態(tài),并繼續(xù)執(zhí)行后續(xù)邏輯,后續(xù)邏輯可以直接應用當前方法體的調用 結果,對于開發(fā)人員來說,異步調用被封裝在方法體內部,看到的只是該方 法體的處理和后續(xù)邏輯的順序執(zhí)行,就像同步調用一樣,因此,可以降低業(yè) 務開發(fā)的復雜度,提高業(yè)務開發(fā)效率??傊?,本發(fā)明實施例所記載的技術方案可以同時兼顧系統(tǒng)的處理性能和業(yè)務開發(fā)效率。
圖1為本發(fā)明實施例中分布式處理裝置實施例結構示意圖; 圖2為本發(fā)明實施例中分布式調用消息的方法實施例流程圖; 圖3為本發(fā)明實施例中異步調用的流程圖; 圖4為本發(fā)明實施例中的狀態(tài)圖。
具體實施方式
參照圖1,為本發(fā)明實施例中分布式處理裝置實施例結構示意圖,該分布 式處理裝置包括消息調用單元11和信息處理單元12,其中消息調用單元31包括消息發(fā)送單元111、消息接收單元112、信息存儲 單元113、棧信息維護單元114,其中消息發(fā)送單元lll,在方法體(method)內部采用異步方式發(fā)送調用請求 消息;消息接收單元112,接收所述調用請求消息的應答消息;信息存儲單元113,保存調用棧信息和所述方法體運行當前狀態(tài);棧信息維護單元114,當所述消息發(fā)送單元111發(fā)送調用請求消息后將所 述調用請求消息的調用棧信息和運行當前狀態(tài)保存到信息存儲單元113并退 出所述方法體;在消息接收單元112接收到應答消息時,將保存在信息存儲 單元113的調用棧信息恢復;信息處理單元12,根據棧信息維護單元114恢復出的棧信息,恢復到退 出所述方法體前所處運行當前狀態(tài),繼續(xù)執(zhí)行后續(xù)邏輯。信息處理單元保存的調用棧信息和調用請求消息——對應,可以設置調 用請求消息標識與調用棧信息的對應關系,并且消息接收單元所返回的應答 消息中攜帶有與調用請求消息一致的標識,以使棧信息維護單元能夠較快地 查找到保存的調用棧信息并恢復。信息處理單元執(zhí)行后續(xù)邏輯可以是后續(xù)正常邏輯、超時處理邏輯,也可能是異常處理邏輯,分別對應消息接收單元所接收到的應答消息所攜帶的業(yè) 務調用結果??梢岳斫獾氖牵龇植际教幚硌b置并不表示具體的設備名稱,僅用于 表示可以用于分布式處理的裝置。這種分布式處理裝置應用范圍非常廣泛, 可以位于計算機、網絡中等有分布式處理單元的任何的分布式處理系統(tǒng)中。對于這種分布式處理裝置,可以通過消息調用單元對其他的遠程服務進 行調用,指定被調用對象和被調用方法體、設置調用參數(shù)等,通過消息驅動 狀態(tài)進行遷移,并且在遷移前消息調用單元已經接收返回結果,信息處理單 元可以直接利用該返回結果,所以,從使用體驗上來看,異步調用被封裝在 方法體內部,開發(fā)人員看到的只是該方法體的處理和后續(xù)邏輯的順序執(zhí)行,和同步調用完全相同,因此這種分布式處理裝置的消息調用方式對開發(fā)人員 來講更友好,可以降低業(yè)務開發(fā)的復雜度,提高業(yè)務開發(fā)效率。而在消息調 用單元內部,使用異步方式進行消息調用,在等待消息應答期間,線程不會 被堵塞,可以繼續(xù)處理別的業(yè)務,因此同時也可以保證系統(tǒng)的處理性能。綜 上,這種分布式處理裝置既能提高業(yè)務開發(fā)效率,又能兼顧系統(tǒng)處理性能。參照圖2,為一個分布式調用消息的方法實施例流程圖,以下通過方法體Fl中的具體調用過程進行說明步驟21、在方法體F1中采用異步調用方式發(fā)送foo調用請求消息并執(zhí)行 步驟22;其中,方法體(method)為類的成員,是與類關聯(lián)的函數(shù),可以訪問所 在類中的元素。對于上述異步調用方式,參照圖3,為本發(fā)明實施例中異步調用的流程圖, 在分布式系統(tǒng)中進行一來一回兩次異步調用的具體過程如下步驟211、調用者向被調用者發(fā)起調用請求;調用者發(fā)起調用后,繼續(xù)執(zhí)行后續(xù)邏輯。步驟212、被調用者接收到請求后進行處理;步驟213、被調用者發(fā)起調用請求,其中攜帶有處理調用者請求所得到的結果。步驟214、調用者接收被調用者的調用請求,進行處理,得到處理結果。步驟22、保存foo調用請求消息的調用棧信息及運行當前狀態(tài)并退出方 法體F1;在退出方法體F1前保存所述調用棧信息及運行當前狀態(tài),然后釋放當前 線程,此后線程可以繼續(xù)處理其他調用,以保證系統(tǒng)的處理性能。步驟23、當接收到foo調用請求消息的應答消息后,恢復保存的調用棧 4呂息;步驟24、根據恢復的調用棧信息,恢復到退出Fl方法體前所處運行當前 狀態(tài),繼續(xù)執(zhí)行后續(xù)邏輯。調度線程根據恢復的調用棧信息再次調度進入方法體F1后,從退出方法 體Fl前的運行當前狀態(tài)繼續(xù)執(zhí)行后續(xù)邏輯,直到方法體Fl邏輯結束并退出 方法體F1。由于后續(xù)邏輯可以直接使用步驟43應答消息中所返回的調用結果,因此, 從開發(fā)人員來看,與同步調用方式相同,不需要打亂業(yè)務邏輯,因此可以降 低業(yè)務開發(fā)的復雜度,提高業(yè)務開發(fā)效率。其中,為了較快地查找到保存的調用棧信息,迅速恢復到退出方法體F1 前所處運行當前狀態(tài),可以設置調用棧信息與調用請求消息和調用應答消息 的對應關系,具體為預先設定調用請求消息的標識與該請求消息對應的應 答消息具有相同的標識(ID, Identification),在保存調用棧信息的同時,保存該 調用棧信息對應的調用請求消息的ID,當接收到所述調用請求消息的應答消 息時,查找與應答消息具有相同ID的調用棧信息,進而恢復該調用棧信息及 退出方法體前所處運行當前狀態(tài),執(zhí)行后續(xù)邏輯。為便于理解,這種方法可以采用狀態(tài)圖對應用服務的邏輯進行描述,可 以定義一系列狀態(tài),由消息驅動狀態(tài)進行遷移,參照圖4,為本發(fā)明實施例中 的狀態(tài)圖,其中,服務調用圖元(ServiceCall) 41可以表示對其他遠程服務 的調用,如指定被調用對象和被調用方法,設置調用參數(shù)等,并且在繼續(xù)遷移前已經接收返回值,下一狀態(tài)可以直接使用返回值,所以從使用體驗上看,和同步調用完全相同。服務調用圖元有三種出口調用正常出口、調用異常 出口和調用超時出口,分別對應業(yè)務調用的三種結果下一狀態(tài)42、異常處 理43和超時處理44。如果在狀態(tài)圖中以同步調用的方式調用了遠端方法體foo,其處理過程如 下在方法體F1內部采用異步方式發(fā)送foo請求后會中途退出方法體Fl,退 出前要把調用棧信息以及運行當前狀態(tài)保存下來,然后釋放當前進程,此時 線程可以繼續(xù)處理其他調用,等到foo請求的應答消息到達后,調度線程再次 調度進入方法體Fl,此時要恢復上次退出時保存的調用棧信息和退出前所處 當前運行狀態(tài),然后從退出前狀態(tài)繼續(xù)執(zhí)行后續(xù)邏輯,直到方法體F1的邏輯 結束并退出方法體F1。這里例舉的僅僅是一種實現(xiàn)方案,可以理解的是,為了達到調用棧信息 保存和恢復的目的,并不僅限于此種方案。從該技術方案可以看出,通過在方法體內部采用異步調用方式發(fā)送調用 請求消息,在等待應答期間,線程被釋放,可以處理別的調用請求,因此可 以保證系統(tǒng)的處理性能;同時,當接收到所述調用請求消息的應答消息后, 可以根據保存的調用棧信息直接恢復到退出所述方法體前所處運行當前狀 態(tài),繼續(xù)執(zhí)行后續(xù)邏輯,因此,后續(xù)邏輯可以直接應用當前方法體的調用結 果,對于開發(fā)人員來說,看到的只是該方法體的處理和后續(xù)邏輯的順序執(zhí)行, 執(zhí)行邏輯并沒有被打亂,因此,可以降低業(yè)務開發(fā)的復雜度,提高業(yè)務開發(fā) 效率。綜上可知,本發(fā)明實施例可以兼顧系統(tǒng)處理性能與業(yè)務開發(fā)效率。以下通過具體的應用場景,對本發(fā)明實施例中分布式調用消息的方法進 行詳細描述具體場景為類CDemoClass調用遠端IF2接口 ,在類CDemoClass中的 方法體StateProcess中實現(xiàn)分布式調用,以下通過具體步驟進行詳細說明步驟51、類CDemoClass啟動后,進入方法體StateProcess的同時將自身 的一個Context成員m—StateContext傳入作為Context類鏈表的根節(jié)點;步驟52、方法體StateProcess在方法體內部創(chuàng)建CStateProcessContext實例并保存在Context類鏈表上;步驟53、方法體StateProcess從初始狀態(tài)開始遷移;步驟54、當方法體StateProcess遷移到方法體調用狀態(tài),此時需要調用遠 端的IF2:: foo(int a)接口方法體;1) 首先產生一個本地代理IF2存根類型的對象,然后調用IF2存根的foo 方法體;2) 在IF2存根的方法體內部又會創(chuàng)建一個Context類實例并保存在 Context類鏈表上,然后進入foo方法體的狀態(tài)機,該狀態(tài)機有兩個狀態(tài)發(fā) 送請求狀態(tài)和接收應答狀態(tài);3) 首先進入發(fā)送請求狀態(tài),按照異步調用方式構造一個調用請求消息并 通過軟總線發(fā)送出去,發(fā)送后將當前運行狀態(tài)設置為接收應答狀態(tài),并且需 要等待應答消息,然后退出方法體StateProcess,釋放調度線程,此時所有的 調用棧信息都保存在Context類中。可以將被調用對象、方法體和調用參數(shù)等調用信息構造成調用請求消息 并發(fā)送。步驟55 、當收到軟總線上返回的應答消息時,再次調進方法體StateProcess 內部,并根據應答消息的ID從Context鏈中找到當前Context對象并恢復上次 調用棧信息,從退出點繼續(xù)執(zhí)行,再次進入IF2存根的方法體,直接遷移到接 收請求狀態(tài),取出應答消息中的返回值返回;步驟56、繼續(xù)執(zhí)行后來處理邏輯,所述后續(xù)處理邏輯可以直接使用方法 體StateProcess調用的返回j直??梢钥闯?,該實施例中由于在方法體StateProcess內部采用異步方式發(fā)送 調用請求消息,發(fā)送后將當前運行狀態(tài)設置為接收應答狀態(tài),并且需要等待 應答消息,然后退出方法體StateProcess,釋放調度線程,此時所有的調用棧 信息都保存在Context類中。當收到應答消息時,再次調進方法體StateProcess 內部,并根據應答消息的ID從Context鏈中找到當前Context對象并恢復上次 調用棧信息,從退出點繼續(xù)執(zhí)行,再次進入IF2存根的方法體,直接遷移到接收請求狀態(tài),取出應答消息中的返回值返回,并繼續(xù)執(zhí)行后來處理邏輯,所述后續(xù)處理邏輯可以直接使用方法體StateProcess調用的返回值。因此,在等 待應答期間,線程可以處理別的業(yè)務,不占用線程,與同步調用相比,可以 保證系統(tǒng)的處理性能;而對于開發(fā)人員來說,當接收到所述調用請求消息的 應答消息后,可以根據保存的調用棧信息直接恢復到退出所述方法體前所處 運行當前狀態(tài),繼續(xù)執(zhí)行后續(xù)邏輯,因此,后續(xù)邏輯可以直接應用當前方法 體的調用結果,對于開發(fā)人員來說,看到的只是該方法體的處理和后續(xù)邏輯 的順序執(zhí)行,執(zhí)行邏輯并沒有被打亂,因此,可以降低業(yè)務開發(fā)的復雜度, 提高業(yè)務開發(fā)效率。綜上可知,該實施例所采用的調用消息的方法可以同時 兼顧系統(tǒng)的處理性能與業(yè)務開發(fā)效率。與上一實施例的不同之處在于,該技術方案采用了不同的調用棧信息保 存和恢復方法,該方法具體為首先定義一種用于保存上下文關系的輔助類 上下文(Context)類,事實上,可以對每個方法體生成對應的Context類,把方 法體的參數(shù)和局部變量作為該Context類的成員變量;在對應方法體中,對參 數(shù)和局部變量的訪問全部轉換為訪問Context類的成員。并且,在進入方法體 時,都把該方法體的Context類對象鏈接到上一層方法體的Context類對象上, 由此可以形成一個Context鏈,所以即使中途退出以后還可以方便地找到整個 Context鏈。當進行分布式遠程調用時,會把調用信息構造成請求消息,并通過軟總 線發(fā)送,該消息由一個唯一的消息ID進行標識,將該消息ID存儲在調用的 Context中;而應答消息的ID與前面發(fā)送的調用請求消息的ID是一致的,因 此,當應答消息返回時,可以根據應答消息的ID找到對應的Context對象, 再從中恢復出保存的調用棧信息。這里例舉的僅僅是一種實現(xiàn)方案,可以理解的是,為了達到調用棧信息 保存和恢復的目的,并不僅限于此種方案。領i或晉通寸支術人貝可。 是可以通過程序來指令相關的硬件完成,所述的程序可以存儲于一種計算積』可讀存儲介質中,該程序在執(zhí)行時,包括如下步驟在方法體內部釆用異步方式發(fā)送調用請求消息;保存所述調用請求消息的調用棧信息及運行當前狀態(tài)并退出所述方法體;當接收到所述調用請求消息的應答消息時,恢復保存的所述調用棧信息;根據恢復的調用棧信息,恢復到退出所述方法體前所處運行當前狀態(tài), 繼續(xù)執(zhí)行后續(xù)邏輯。上述提到的存儲介質可以是只讀存儲器,磁盤或光盤等。以上對本發(fā)明所提供的一種分布式調用消息的方法和裝置進行了詳細介 紹,對于本領域的一般技術人員,依據本發(fā)明實施例的思想,在具體實施方 式及應用范圍上均會有改變之處,綜上所述,本說明書內容不應理解為對本 發(fā)明的限制。
權利要求
1.一種分布式調用消息的方法,其特征在于,包括在方法體內部采用異步方式發(fā)送調用請求消息;保存所述調用請求消息的調用棧信息及運行當前狀態(tài)并退出所述方法體;當接收到所述調用請求消息的應答消息時,恢復保存的所述調用棧信息;根據恢復的調用棧信息,恢復到退出所述方法體前所處運行當前狀態(tài),繼續(xù)執(zhí)行后續(xù)邏輯。
2. 如權利要求1所述的分布式調用消息的方法,其特征在于,在在退出 所述方法體之前進一步包括將所述方法體運行當前狀態(tài)設置為接收應答狀態(tài)。
3. 如權利要求1所述的分布式調用消息的方法,其特征在于,保存所述 調用請求消息的調用棧信息具體為保存所述調用請求消息的標識和對應的 調用棧信息;恢復保存的所述調用棧信息具體為根據接收到的所述調用請求消息的 應答消息的標識,查找保存有相同標識的調用棧信息并恢復,其中,預設所 述應答消息的標識與調用請求消息 一致。
4. 如權利要求1所述的分布式調用消息的方法,其特征在于,保存所述 調用請求消息的調用棧信息的方法具體為將調用請求消息的標識及調用棧信息保存在預設的上下文類中,所述上 下文類中類對象與方法體——對應,且所述方法體對應的類對象^T連接到上一 層方法體的類對象上形成上下文類鏈表;所述恢復保存的調用棧信息具體為查找與所述應答消息的標識一致的 上下文類對象,再將保存的該類對象對應的調用棧信息恢復。
5. 如權利要求1至4所述的分布式調用消息的方法,其特征在于,所述 保存的調用棧信息包括祐匸調用對象、方法體、調用參數(shù)。
6. 如權利要求1至4所述的分布式調用消息的方法,其特征在于,所述執(zhí)行后續(xù)邏輯具體為執(zhí)行后續(xù)正常邏輯、執(zhí)行超時處理邏輯或者執(zhí)行異常 處理邏輯其中之一。
7. —種分布式處理裝置,其特征在于,包括消息調用單元和信息處理 單元,其中所述消息調用單元包括消息發(fā)送單元、信息存儲單元、棧信息維護單 元、消息接收單元,其中消息發(fā)送單元,在方法體內部釆用異步方式發(fā)送調用請求消息;消息接收單元,接收所述調用請求消息的應答消息;信息存儲單元,保存調用棧信息和所述方法體運行當前狀態(tài);棧信息維護單元,當所述消息發(fā)送單元發(fā)送調用請求消息后將所述調用 請求消息的調用棧信息和運行當前狀態(tài)保存到信息存儲單元并退出所述方法 體;在消息接收單元接收到應答消息時,將保存在信息存儲單元的調用棧信 息恢復;信息處理單元,根據棧信息維護單元恢復出的棧信息,恢復到退出所述 方法體前所處運行當前狀態(tài),繼續(xù)執(zhí)行后續(xù)邏輯。
全文摘要
本發(fā)明公開了一種分布式調用消息的方法和裝置。本發(fā)明方法包括在方法體內部采用異步方式發(fā)送調用請求消息;保存所述調用請求消息的調用棧信息及運行當前狀態(tài)并退出所述方法體;當接收到所述調用請求消息的應答消息時,恢復保存的所述調用棧信息;根據恢復的調用棧信息,恢復到退出所述方法體前所處運行當前狀態(tài),繼續(xù)執(zhí)行后續(xù)邏輯。以上方法和相應的處理裝置能夠同時兼顧系統(tǒng)的處理性能和業(yè)務開發(fā)效率。
文檔編號H04L29/08GK101262498SQ20081009461
公開日2008年9月10日 申請日期2008年4月22日 優(yōu)先權日2008年4月22日
發(fā)明者凱 丁, 李戰(zhàn)杰, 海 申 申請人:華為技術有限公司