專利名稱::分布式處理系統(tǒng)中的復制命名服務的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及分布式處理系統(tǒng),尤其涉及分布式處理系統(tǒng)中的計算機軟件。相互參照相關(guān)申請本申請要求1998年11月5日提出的美國臨時申請No.60/107,167的權(quán)益。下列同時待審的美國專利申請已轉(zhuǎn)讓給本申請的受讓人,將它們的公開文本插在這里以供參考(A)序號(尚不知)(代理人備案號(AttorneyDocketNo.)BEAS1027),由DeanB.Jacobs和AnnoR.Langen提出申請(尚不知),原標題分布式處理系統(tǒng)中具有消息傳送核心模塊的集團型企業(yè)JAVATM(“CLUSTEREDENTERPRISEJAVATMHAVINGAMESSAGEPASSINGKERNELINADISTRIBUTEDPR0CESSINGSYSTEM”);(B)序號(尚不知)(代理人備案號BEAS1029),由DeanB.Jacobs和EricM.Halpern提出申請(尚不知),原標題分布式處理系統(tǒng)中的智能存根模塊或企業(yè)JAVATM豆模塊(“ASMARTSTUBORENTERPRISEJAVATMBEANINADISTRIBUTEDPROCESSINGSYSTEM”);和(C)序號(尚不知)(代理人備案號BEAS1031),由DeanB.Jacobs和AnnoR.Langen提出申請(尚不知),原標題在安全分布式處理系統(tǒng)中的集團型企業(yè)JAVATM(“CLUSTEREDENTERPRISEJAVATMINASECUREDISTRIBUTEDPROCESSINGSYSTEM”)。圖1所示的客戶機/服務器結(jié)構(gòu)110是一種類型的分布式處理系統(tǒng)??蛻魴C/服務器結(jié)構(gòu)110包括至少兩個處理設備,表示為客戶機105和應用程序服務器103。附加的客戶機也可以與通信媒體104連接,例如客戶機108。通常,服務器103是商用邏輯模塊(businesslogic)的宿主和/或協(xié)調(diào)事務處理以向另外的處理設備,例如客戶機105和/或客戶機108提供服務。應用程序服務器103通常用提供服務的軟件編程。軟件可以利用各種各樣的編程模型,例如圖1a-b所示的EnterpriseJavaTMBean(“EJB”)100b編程。服務可以包括,例如,檢索和傳送來自數(shù)據(jù)庫的數(shù)據(jù),提供圖像和/或解方程。例如,服務器103可以響應來自客戶機105的請求,通過通信媒體102從永久性存儲器件101中的數(shù)據(jù)庫101a檢索數(shù)據(jù)。然后,應用程序服務器103可以通過通信媒體104傳送請求數(shù)據(jù)到客戶機105??蛻魴C是利用來自服務器的服務和可以請求服務的處理設備。用戶106經(jīng)常與客戶機105交互操作,并可以使客戶機105通過通信媒體104從應用程序服務器103請求服務??蛻魴C經(jīng)常處理與最終用戶的直接交互操作,例如接受請求和顯示結(jié)果。各種各樣不同類型的軟件可以用于編程應用程序服務器103和/或客戶機105。一種編程語言是JavaTM編程語言。JavaTM應用程序目標代碼被裝載到JavaTM虛擬機(“JVM”)中。JVM是裝載到模擬特定機器或處理設備的處理設備中的程序。關(guān)于JavaTM編程語言的更多信息可以從http//www.javasoft.com站點上獲得,將這個站點列在這里以供參考。圖1b表示若干種JavaTM企業(yè)應用編程接口(“API”)100,這些接口允許JavaTM應用代碼仍然獨立于基本事務處理系統(tǒng)、數(shù)據(jù)庫、和網(wǎng)絡基礎設施。JavaTM企業(yè)API100包括例如,遠程方法調(diào)用(“RMI”)100a、EJB100b、和JavaTM命名和目錄接口(JNDI)100c。RMI100a是經(jīng)常用在如下所述的對等結(jié)構(gòu)(peer-peerarchitecture)中的分布式編程模型。具體地說,一組類別和接口使一個JavaTM對象能夠調(diào)用在不同JVM上運行的另一個JavaTM對象的公開方法。EJB100b的示例通常用在如上所述的客戶機/服務器結(jié)構(gòu)中。EJB100b的示例是軟件成分或可以與其它成分組合的可重用預建的一段封裝的應用程序代碼。通常,EJB100b的示例包括商用邏輯單元。存儲在服務器103中的EJB100b示例通常管理永久性、事務處理、并發(fā)性、線程處理和安全性。JNDI100c向JavaTM軟件應用程序提供目錄和命令功能??蛻魴C/服務器結(jié)構(gòu)110存在著許多缺點。首先,因為服務器103不得不處理許多連接,所以結(jié)構(gòu)110的規(guī)模不能太大。換言之,可以附加到服務器103上的客戶機的數(shù)量受到限制。另外,加倍地添加處理設備(客戶機)未必向你提供加倍的性能。其次,難以維護客戶機105和108上的應用程序代碼。第三,結(jié)構(gòu)110易遭受一些系統(tǒng)故障或單點故障。如果服務器101發(fā)生故障并無法備份,那么客戶機105將不能獲得服務。圖1c表示多層結(jié)構(gòu)160??蛻魴C151和152管理與最終用戶的直接交互操作,接受請求和顯示結(jié)果。應用程序服務器153寄存應用程序代碼、協(xié)調(diào)通信、同步和事務處理。數(shù)據(jù)庫服務器154和便攜式存儲裝置155提供數(shù)據(jù)的持續(xù)事務型管理。多層結(jié)構(gòu)160具有與客戶機/服務器結(jié)構(gòu)110相似的上述缺點。圖2表示對等結(jié)構(gòu)214。處理設備216、217和218與通信媒體213連接。處理設備216、217和218包括通過媒體213通信用的網(wǎng)絡軟件210a、210b、和210c。通常,在對等結(jié)構(gòu)中的每個處理設備具有相似的處理能力和應用程序。對等程序模型的例子包括CommonObjectRequestBrokerArchitecture(公用對象請求中介架構(gòu))(“CORBA”,)和DistributedObjectComponentModel(分布式對象組件模型)(“DCOM”)結(jié)構(gòu)。在一個平臺特定的分布式處理系統(tǒng)中,各個處理設備可以運行相同的操作系統(tǒng)。這樣就允許諸如共享盤、多尾盤(multi-taileddisk)和高速互連之類的專有硬件用于處理設備之間的通信。該特定的分布式處理系統(tǒng)平臺的例子包括IBMCorporation′sS/390ParallelSysplex、Compaq′sTandemDivisionHimalaya服務器、Compaq′sDigitalEquipmentCorporationTM(DECTM)DivisionOpenVMSTMCluster軟件、和MicrosoftCorporationWindowsNTClusterServices(Wolfpack)。圖2b示出了事務處理(TP)結(jié)構(gòu)220。具體地說,TP結(jié)構(gòu)220示出了BEASystems,Inc.TUXEDO結(jié)構(gòu)。TP監(jiān)視器224分別通過通信媒體280、281和282與處理設備ATM221、PC222和TP監(jiān)視器223連接。ATM221可以是自動出納機,PC222可以是個人計算機,和TP監(jiān)視器223可以是另一個事務處理監(jiān)視器。TP監(jiān)視器224通過通信媒體283、284和285與后臺服務器225、226和227連接。服務器225通過通信媒體286與永久性存儲裝置287、存儲數(shù)據(jù)庫289連接。TP監(jiān)視器224包括工作流控制器224a,工作流控制器224a用于將來自諸如ATM221、PC222、或TP監(jiān)視器223的處理設備的服務請求擇徑(routing)到諸如服務器225、226和227的各種服務器。工作流控制器224a允許做到(1)服務器之間的工作負載平衡,(2)受限制的規(guī)??缮炜s性或允許附加的服務器和/或客戶機,(3)冗余后臺服務器的容錯性(或服務請求可以由工作流控制器發(fā)送到?jīng)]有故障的服務器),和(4)會話集中以限制同時連接到后臺服務器的數(shù)量。其它事務處理結(jié)構(gòu)的例子包括IBMCorporation′sCICS、Compaq′sTandemDivisionPathway/Ford/TS、Compaq′sDECTMACMS、和TransarcCorporation′sEncina。TP結(jié)構(gòu)220也存在著許多缺點。首先,單個處理設備或TP監(jiān)視器224的故障可以使網(wǎng)絡變成不能工作。其次,規(guī)??缮炜s性或與TP監(jiān)視器224連接的處理設備(服務器和客戶機兩者)的數(shù)量可能受TP監(jiān)視器224的硬件或軟件的限制。第三,將客戶機請求擇徑到服務器的靈活性受到限制。例如,如果通信媒體280不能工作,但通信媒體290可以使用,那么,ATM221通常不可以通過通信媒體290直接從服務器225請求服務,而必須訪問TP監(jiān)視器224。第四,客戶機通常不知道后臺服務器或其它處理設備的狀態(tài)。第五,沒有工業(yè)標準軟件或API用于負載平衡。和第六,即使客戶機含有能夠進行高效服務的相關(guān)信息,客戶機通常也不可以選擇特定的服務器。因此,最好是能提供一種分布式處理系統(tǒng),尤其是能提供一種具有現(xiàn)有技術(shù)分布式處理系統(tǒng)的優(yōu)點而沒有其固有缺點的分布式處理系統(tǒng)軟件。該軟件應該考慮到通常用在客戶機/服務器、多層或?qū)Φ确植际教幚硐到y(tǒng)中的工業(yè)標準API。該軟件應該支持各種各樣的計算機編程模型。并且,該軟件還應該能允許(1)提高容錯性、(2)有效率的規(guī)??缮炜s性、(3)有效的負載平衡、和(4)會話集中控制。改進了的計算機軟件應該考慮到重新?lián)駨交蚓W(wǎng)絡重新配置。此外,該計算機軟件還應該允許處理設備狀態(tài)的確定。發(fā)明概述本發(fā)明的目的是提供一種改進分布式處理系統(tǒng),尤其提供一種供分布式處理系統(tǒng)用的計算機軟件。該計算機軟件改進了分布式處理系統(tǒng)的容錯性,以及能有高效率的規(guī)模可伸縮性。該計算機軟件允許有效的負載平衡和會話集中。該計算機軟件支持重新?lián)駨交蛴嬎銠C網(wǎng)絡的重新配置。該計算機軟件支持各種各樣的計算機編程模型和允許用在客戶機/服務器和對等分布式處理結(jié)構(gòu)兩者中的工業(yè)標準API的使用。該計算機軟件允許服務器或其它處理設備狀態(tài)的確定。該計算機軟件還支持在包括安全性模型在內(nèi)的各種情況下的消息轉(zhuǎn)發(fā)。根據(jù)本發(fā)明的一個方面,分布式處理系統(tǒng)包括與第一處理設備和第二處理設備連接的通信媒體。第一處理設備包括模擬處理設備(“JVM1”)的第一軟件程序,含有具有數(shù)據(jù)結(jié)構(gòu)(“RJVM1”)的第一核心軟件層。第二處理設備包括模擬處理設備(“JVM2”)的第一軟件程序,含有具有數(shù)據(jù)結(jié)構(gòu)(“RJVM2”)的第一核心軟件層。來自第一處理設備的消息通過第一處理設備中的第一核心軟件層和第一軟件程序傳送到第二處理設備中的第一核心軟件層和第一軟件程序。根據(jù)本發(fā)明的另一個方面,在第一處理設備中的第一軟件程序是JavaTM虛擬機(“JVM”),和在第一處理設備中的數(shù)據(jù)結(jié)構(gòu)是遠程JavaTM虛擬機(“RJVM”)。類似地,在第二處理設備中的第一軟件程序是JVM,和在第二處理設備中的數(shù)據(jù)結(jié)構(gòu)是RJVM。第二處理設備中的RJVM對應于第一處理設備中的JVM。根據(jù)本發(fā)明的另一個方面,第一處理設備中的RJVM包括接頭(socket)管理器軟件部分、線程(thread)管理器軟件部分、消息擇徑軟件部分、消息壓縮軟件部分、和/或?qū)Φ认?peer-gone)檢測軟件部分。根據(jù)本發(fā)明的另一個方面,第一處理設備利用從由下列協(xié)議組成的協(xié)議組中選擇的協(xié)議與第二處理設備進行通信TransmissionControlProtocol(傳輸控制協(xié)議)(“TCP”)、SecureSocketsLayer(安全接頭協(xié)議)(“SSL”)、HypertextTransportProtocol(超文本傳輸協(xié)議)(“HTTP”)隧道技術(shù)、和InternetInterORBProtocol(互聯(lián)網(wǎng)ORB間協(xié)議)(“IIOP”)隧道技術(shù)。根據(jù)本發(fā)明的另一個方面,第一處理設備包括存儲JavaTM應用程序的存儲器。根據(jù)本發(fā)明的另一個方面,第一處理設備是第二處理設備的對等物。此外,第一處理設備是服務器,和第二處理設備是客戶機。根據(jù)本發(fā)明的另一個方面,第二通信媒體與第二處理設備連接。第三處理設備與第二通信媒體連接。第三處理設備包括模擬處理設備(“JVM3”)的第一軟件程序,含有具有第一數(shù)據(jù)結(jié)構(gòu)(“RJVM1”)和第二數(shù)據(jù)結(jié)構(gòu)(“RJVM2”)的核心軟件層。根據(jù)本發(fā)明的另一個方面,第一處理設備包括含有復制管理器軟件部分的存根模塊(“stub”)。復制管理器軟件部分包括負載平衡軟件部分和故障處理(failover)軟件部分。根據(jù)本發(fā)明的另一個方面,第一處理設備包括EnterpriseJavaTMBean對象。根據(jù)本發(fā)明的另一個方面,第一處理設備包括存儲在樹節(jié)點上的、含有存根模塊庫的命名樹,和第二處理設備包括該命名樹的復制件。根據(jù)本發(fā)明的另一個方面,第一處理設備包括以無狀態(tài)程序模型(statelessprogrammodel)編碼的應用程序,和該應用程序包括無狀態(tài)會話豆模塊(statelesssessionbean)。根據(jù)本發(fā)明的另一個方面,第一處理設備包括以無狀態(tài)工廠程序模型(statelessfactoryprogrammodel)編碼的應用程序,和該應用程序包括有狀態(tài)會話豆模塊(statefulsessionbean)。根據(jù)本發(fā)明的另一個方面,第一處理設備包括以有狀態(tài)程序模型(statefulprogrammodel)編碼的應用程序,和該應用程序包括實體會話豆模塊(entitysessionbean)。根據(jù)本發(fā)明的另一個方面,提供包括信息存儲媒體的制品。該制品包含將消息從第一處理設備中的RJVM傳送到第二處理設備中的RJVM的第一組數(shù)字信息。根據(jù)本發(fā)明的另一個方面,該制品包含第一組數(shù)字信息,包括含有從多個服務提供者中選擇一個服務提供者的負載平衡軟件程序的存根模塊。根據(jù)本發(fā)明的另一個方面,存根模塊含有從多個服務提供者中刪除一個發(fā)生了故障的服務提供者的故障處理軟件部分。根據(jù)本發(fā)明的另一個方面,負載平衡軟件部分基于對一個特定服務提供者的親緣關(guān)系(affinity)選擇一個服務提供者。根據(jù)本發(fā)明的另一個方面,負載平衡軟件部分以循環(huán)(roundrobin)方式選擇服務提供者。根據(jù)本發(fā)明的另一個方面,負載平衡軟件部分以隨機方式選擇服務提供者。根據(jù)本發(fā)明的另一個方面,負載平衡軟件部分根據(jù)每個服務提供者的負載從多個服務提供者中選擇一個服務提供者。根據(jù)本發(fā)明的另一個方面,負載平衡軟件部分根據(jù)所請求的數(shù)據(jù)類型從多個服務提供者中選擇一個服務提供者。根據(jù)本發(fā)明的另一個方面,負載平衡軟件部分根據(jù)物理上最接近的服務提供者從多個服務提供者中選擇一個服務提供者。根據(jù)本發(fā)明的另一個方面,負載平衡軟件部分根據(jù)每個服務提供者響應的時間周期從多個服務提供者中選擇一個服務提供者。根據(jù)本發(fā)明的另一個方面,該制品包含第一組數(shù)字信息,包括從多個服務提供者中選擇一個服務提供者的EnterpriseJavaTMBean對象。根據(jù)本發(fā)明的另一個方面,存根模塊存儲在分布式處理系統(tǒng)中的處理設備中。存根模塊包括由下列步驟組成的方法獲取服務提供者列表,和從該服務提供者列表中選擇一個服務提供者。根據(jù)本發(fā)明的另一個方面,該方法還包括從服務提供者列表中刪除發(fā)生故障的服務提供者。根據(jù)本發(fā)明的另一個方面,一種設備包括與第一處理設備和第二處理設備連接的通信媒體。第一處理設備存儲命名樹,該命名樹包括用于訪問服務提供者的遠程方法調(diào)用(“RMI”)存根模塊。第二處理設備含有復制的命名樹和服務提供者。根據(jù)本發(fā)明的另一個方面,命名樹含有包括當前服務提供者的服務庫的節(jié)點。根據(jù)本發(fā)明的另一個方面,服務庫包括存根模塊(stub)。根據(jù)本發(fā)明的另一個方面,分布式處理系統(tǒng)包括與第二計算機連接的第一計算機。第一計算機含有命名樹,包括訪問服務提供者的遠程調(diào)用存根模塊。第二計算機含有復制的命名樹和服務提供者。根據(jù)本發(fā)明的另一個方面,提供了包括與第二處理設備連接的第一處理設備的分布式處理系統(tǒng)。第一處理設備具有JVM和包括第一RJVM的第一核心軟件層。第二處理設備具有第一JVM和包括第二RJVM的第一核心軟件層。當在第一JVM和第二JVM之間沒有可用的接頭時,可以將消息從第一處理設備傳送到第二處理設備。根據(jù)本發(fā)明的另一個方面,第一處理設備在防火墻之后,在小應用程序(applet)安全模型下運行,或者是一個客戶機,和第二處理設備也是一個客戶機。通過參照隨后的附圖、詳細說明和權(quán)利要求書,可以看出本發(fā)明的其它特征和優(yōu)點。附圖簡述圖1a表示現(xiàn)有技術(shù)的客戶機/服務器結(jié)構(gòu);圖1b表示現(xiàn)有技術(shù)的JavaTM企業(yè)API;圖1c表示多層結(jié)構(gòu);圖2a表示現(xiàn)有技術(shù)的對等結(jié)構(gòu);圖2b表示現(xiàn)有技術(shù)的事務處理結(jié)構(gòu);圖3a表示本發(fā)明實施例的簡化軟件方塊圖;圖3b表示圖3a所示的核心模塊的簡化軟件方塊圖;圖3c表示集團型(clustered)企業(yè)JavaTM結(jié)構(gòu);圖4表示集團型企業(yè)JavaTM命名服務結(jié)構(gòu);圖5a表示智能存根模塊(smartstub)結(jié)構(gòu);圖5b表示EJB對象結(jié)構(gòu);圖6a是說明負載平衡方法的控制流程圖;圖6b-g是說明負載平衡方法的控制流程圖;圖7是說明故障處理方法的的控制流程圖;圖8表示在圖3-5所示的集團型企業(yè)JavaTM結(jié)構(gòu)中客戶機/服務器的硬件和軟件部分。通過參照附圖和如下的詳細說明,可以更好地理解本發(fā)明。在附圖中,相同的標號表示相同的部分。詳細說明I.集團型企業(yè)JavaTM分布式處理系統(tǒng)A.集團型企業(yè)JavaTM軟件結(jié)構(gòu)圖3a示出了根據(jù)本發(fā)明實施例的、在集團型企業(yè)JavaTM系統(tǒng)的處理設備中的軟件層的簡化方塊圖380。下面描述集團型企業(yè)JavaTM分布式處理系統(tǒng)的詳細說明。軟件的第一層包括通信媒體軟件驅(qū)動器351,用于傳送和接收在諸如以太網(wǎng)局域網(wǎng)之類的通信媒體上的信息。包括傳輸控制協(xié)議(“TCP”)軟件部分353和因特網(wǎng)(“IP”)軟件部分352的操作系統(tǒng)310是以特定格式檢索提取和發(fā)送信息包或信息塊的上層軟件層?!吧蠈印避浖右话愣x為一個利用或訪問一個或多個“下層”軟件層的軟件部分或幾個軟件部分。接著,實現(xiàn)JVM354。然后,將含有遠程JavaTM虛擬機356的核心模塊層355放置在JVM354的上面。下面要詳述的核心模塊355用于在集團型企業(yè)JavaTM分布式處理系統(tǒng)中的處理設備之間傳送消息。遠程方法調(diào)用357和企業(yè)JavaTM豆模塊(bean)358是核心模塊355的上層軟件層。EJB358是用于各種JavaTM應用程序的容器。圖3b表示圖3a所示的核心模塊355的細節(jié)圖。核心模塊355包括接頭管理器部分363、線程管理器部分364、和RJVM356。RJVM356是包括消息擇徑軟件部分360、含有簡表161c的消息壓縮軟件部分361、和對等消失檢測軟件部分362的數(shù)據(jù)結(jié)構(gòu)。RJVM356和線程管理器部分364與接頭管理器部分363交互操作以在處理設備之間傳輸信息。B.分布式處理系統(tǒng)圖3表示集團型企業(yè)JavaTM分布式處理系統(tǒng)300的簡化方塊圖。處理設備與通信媒體301連接。通信媒體301可以是有線和/或無線的通信媒體,或它們的組合。在一個實施例中,通信媒體301是局域網(wǎng)(LAN)。在另一個實施例中,通信媒體301是廣域網(wǎng)(WAN),例如,因特網(wǎng)或萬維網(wǎng)(WWW)。再在另一個實施例中,通信媒體301是LAN和WAN兩者。各種不同類型的處理設備都可以與通信媒體301連接。在一個實施例中,處理設備可以是如下所述的、如圖8所示的通用計算機100。本領(lǐng)域的普通技術(shù)人員應該理解,圖8和下列說明僅描述了一種特定類型的處理設備,而按照本發(fā)明的實施例可以使用帶有不同軟件和硬件配置的許多其它類型的處理設備。在另一個實施例中,處理設備可以是打印機、手持式計算機、膝上型計算機、掃描儀、蜂窩式電話、尋呼機、或它們的等效物。圖3c表示本發(fā)明中服務器302和303與通信媒體301連接的實施例。服務器303還與通信媒體305連接,通信媒體305可以具有與上面針對通信媒體301所述相似的實施例??蛻魴C304也與通信媒體305連接。在另一個實施例中,客戶機304可以如圖3中虛線和方塊所示的那樣與通信媒體301連接。應該理解為,在另一個實施例中,服務器302是(1)客戶機和服務器兩者、或(2)客戶機。類似地,圖3表示了其中表示三個處理設備的實施例,而本發(fā)明的其它實施例包括了如省略號所示的許多其它處理設備或通信媒體。服務器302分別利用網(wǎng)絡軟件302a和網(wǎng)絡軟件303a將通信媒體301上的信息傳輸?shù)椒掌?03。在一個實施例中,網(wǎng)絡軟件302a、303a、和304a包括通信媒體軟件驅(qū)動器351、傳輸控制協(xié)議軟件353和因特網(wǎng)協(xié)議軟件352(“TCP/IP”)??蛻魴C304還包括網(wǎng)絡軟件304a,用于通過通信媒體305將信息傳輸?shù)椒掌?03。服務器303中的網(wǎng)絡軟件303a還用于通過通信媒體305將信息傳輸?shù)娇蛻魴C304。根據(jù)本發(fā)明的實施例,集團型企業(yè)JavaTM結(jié)構(gòu)300中的每個處理設備都包括支持多層和對等功能兩者的消息傳遞核心模塊355。核心模塊是用于向處理設備上的其它軟件程序提供基本服務的軟件程序。具體地說,服務器302、服務器303、和客戶機304分別含有核心模塊302b、303b、和304b。具體地,為了使兩個JVM交互操作,無論它們是客戶機還是服務器,每個JVM都構(gòu)造代表另一個的RJVM。消息從一側(cè)上的上層發(fā)出,通過相應的RJVM,跨過通信媒體,再通過對等的RJVM,最后被傳送到另一側(cè)上的上層。在各種實施例中,消息可以利用各種不同的協(xié)議傳輸,包括(但不限于)TransmissionControlProtocol/InternetProtocol(“TCP/IP”)、SecureSocketsLayer(“SSL”)、HypertextTransportProtocol(“HTTP”)隧道技術(shù)、和InternetInterORBProtocol(“IIOP”)隧道技術(shù)、和它們的組合。RJVM和接頭管理器創(chuàng)建和維護以這些協(xié)議為基本接頭和在上層中的所有對象之間共享它們。接頭(socket)是代表分布式處理系統(tǒng)中的處理設備之間的端點(terminal)的邏輯位置。核心模塊維護執(zhí)行線程庫,和線程管理器軟件部分364多路復用接頭讀取和請求執(zhí)行之間的線程。線程是執(zhí)行程序代碼段或功能的序列。例如,服務器302包括JVM1和JavaTM應用程序302c。服務器302還包括代表服務器303的JVM2的RJVM2。如果消息要從服務器302發(fā)送到服務器303,則消息通過服務器302中的RJVM2發(fā)送到服務器303中的RJVM1。C.消息轉(zhuǎn)發(fā)集團型企業(yè)JavaTM網(wǎng)絡300能夠通過中間服務器轉(zhuǎn)發(fā)消息。如果客戶機通過前臺網(wǎng)關(guān)從后臺服務器請求服務,則這種功能是重要的。例如,來自服務器302(客戶機302)的消息并具體地JVM1可以通過服務器303(前臺網(wǎng)關(guān))或JVM2轉(zhuǎn)發(fā)到客戶機304(后臺服務器304)或JVM3。這種功能在控制會話集中或在服務器與各種客戶機之間建立多少個連接時是重要的。并且,消息轉(zhuǎn)發(fā)可以用在在兩個JVM之間不能創(chuàng)建接頭的情況中。例如,消息的發(fā)送者正在小應用程序安全模式下運行,而這種模式不允許創(chuàng)建到原始服務器的接頭。小應用程序安全模型的詳細說明可以從http//www.javasoft.com站點上獲得,將這個站點列在這里以供參考。另一個例子包括當消息的接收者處于防火墻之后時。此外,如下所述,消息轉(zhuǎn)發(fā)也可以應用在發(fā)送者是客戶機和接收者是客戶機時,因此不接受任何輸入接頭。例如,如果消息從服務器302發(fā)送到客戶機304,則該消息將不得不通過服務器303擇徑。具體地說,將使RJVM3(代表客戶機304)之間的、如302f所示的消息切換是切換到服務器302中的RJVM2(代表服務器303)。消息將利用接頭302e在服務器302中的RJVM2和服務器303中的RJVM1之間傳輸。然后,消息按虛線303f所示的那樣,從服務器303中的RJVM1切換到服務器303中的RJVM3。接著,消息將在服務器303中的RJVM3和客戶機304中的RJVM2的接頭之間傳送。最后,消息將按虛線304f所示的那樣,從客戶機304中的RJVM2傳送到客戶機304中的RJVM1。D.重新?lián)駨娇蛻魴C/服務器中的RJVM能夠在任何時候?qū)⑼ㄐ怕窂交蛲ㄐ琶襟w切換到其它的RJVM。例如,如果客戶機304創(chuàng)建到服務器302的直接接頭,則服務器302就能夠開始使用該接頭來代替通過服務器303的消息轉(zhuǎn)發(fā)。這個實施例用代表客戶機304的虛線和方塊示出。在一個實施例中,通過RJVM傳輸消息的使用確保了在出現(xiàn)網(wǎng)絡重新配置之后可靠有序的消息傳送。例如,如果客戶機304被重新配置成通信媒體301來代替圖3所示的通信媒體305。在另一個實施例中,消息可以不按順序傳送。RJVM進行幾種通過路由擇徑(routing)實現(xiàn)的端到端操作。首先,RJVM負責各個客戶機/服務器意外死機時的檢測。在一個實施例中,如圖3b所示對等消失選擇軟件部分362負責這種功能。在一個實施例中,當在預定時間間隔內(nèi)沒有發(fā)送其它消息時,RJVM將心跳(heartbeat)消息發(fā)送到其它客戶機/服務器。如果客戶機/服務器在預定計數(shù)時間內(nèi)沒有接收到心跳消息,則檢測到應該發(fā)送心跳的客戶機/服務器發(fā)生故障了。在一個實施例中,通過連接超時或發(fā)生故障的客戶機/服務器是否在預定時間量內(nèi)不發(fā)送消息來檢測發(fā)生故障的客戶機/服務器。在另一個實施例中,發(fā)生故障的接頭指示發(fā)生故障的客戶機/服務器。其次,在消息串行化期間,各個RJVM,特別是消息壓縮軟件360,縮減共同傳輸?shù)臄?shù)據(jù)值以降低消息大小。為了實現(xiàn)這個目的,每個JVM/RJVM對保持匹配縮減表。例如,JVM1包括縮減表,和RJVM1包括匹配縮減表。在消息在中間服務器之間轉(zhuǎn)發(fā)期間,在路由中的中間服務器上消息的主體不進行去串行化。E.多層/對等功能集團型企業(yè)JavaTM結(jié)構(gòu)300考慮到多層和對等編程。集團型企業(yè)JavaTM結(jié)構(gòu)300支持與多層分布式處理結(jié)構(gòu)一致的、用于客戶機/服務器編程的顯式語法。舉例來說,如下的客戶機方代碼片段將信息消息寫入服務器日志文件中<prelisting-type="program-listing"><![CDATA[T3Clientclnt=newT3Client("t3//acme7001");LogServiceslog=clnt.getT3Services().log();Log.info("Hellofromaclient");]]></pre>第一行利用t3協(xié)議建立與頂級(acme)服務器會話。如果RJVM還不存在,則每個JVM構(gòu)造關(guān)于另一方的RJVM,并建立底層(underlying)TCP接頭。這個會話的客戶機方表示-T3Client對象-和服務器方表示通過這些RJVM進行通信。服務器方支持各種各樣的服務,包括數(shù)據(jù)庫訪問、遠程文件訪問、工作空間、事件和日志記錄。第二行獲得LogServices對象,和第三行寫消息。集團型企業(yè)JavaTM計算機結(jié)構(gòu)300還支持與對等分布式處理結(jié)構(gòu)一致的服務器中性的語法。舉例來說,如下的代碼片段從服務器上的遵從JNDI的命名服務中獲得關(guān)于RMI對象的存根模塊,并調(diào)用其方法之一。<prelisting-type="program-listing"><![CDATA[Hashtableenv=newHashtable();env.put(Context.PROVIDER_URL,"t3//acme7001");env.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WeblogicInitialContextFactory");Contextctx=newInitialContext(env);Examplee=(Example)ctx.lookup("acme.eng.example");result=e.example(37);]]></pre>在一個實施例中,JNDI命名上下文被封裝成RMI對象以實現(xiàn)遠程訪問。因此,上面代碼顯示了一種類型的RMI引導(bootstrap)。前四行獲得頂級服務器上關(guān)于初始上下文的RMIstub。如果RJVM還不存在,則每一方都構(gòu)造關(guān)于另一方的RJVM,并建立用于t3協(xié)議的底層TCP接頭。調(diào)用方對象-RMIstub和被叫方對象-RMIimpl-通過RJVM進行通信。第五行查找在名稱acme.eng.example上的另一個RMI對象,即Example和第六行調(diào)用Example方法之一。在一個實施例中,Exampleimpl不在與命名服務相同的處理設備上。在另一個實施例中,Exampleimpl是在客戶機上。Example對象的調(diào)用導致了適當RJVM的創(chuàng)建,如果它們還不存在的話。II.知曉復制的或智能的存根模塊/EJB對象在圖3c中,處理設備通過復制RMI和/或EJB對象能夠向結(jié)構(gòu)300中的其它處理設備提供服務。因此,結(jié)構(gòu)300是易于伸縮的和容錯的。通過將復制的RMI和/或EJB對象加入現(xiàn)有的處理設備或新附加的處理設備中,可以容易地將附加服務加入結(jié)構(gòu)300中。并且,由于RMI和/或EJB對象可以通過結(jié)構(gòu)300復制,因此,單個處理設備、多個處理設備、和/或通信媒體可能發(fā)生故障,但仍然不會使結(jié)構(gòu)300不能工作或顯著變壞。圖5a表示結(jié)構(gòu)500中的知曉復制(“RA”)的或智能的存根模塊580。結(jié)構(gòu)500包括與通信媒體501連接的客戶機504。服務器502和503分別與通信媒體501連接。永久性存儲裝置509分別通過通信媒體560和561與服務器502和503連接。在各種各樣的實施例中,通信媒體501、560和561可以是如上所述的有線和/或無線通信媒體。類似地,在一個實施例中,客戶機504、服務器502、和服務器503可以是如上所述的客戶機和服務器兩者。本領(lǐng)域的普通技術(shù)人員應該理解,在其它可替代的實施例中,多個其它服務器和客戶機可以如省略號所示的那樣包括在結(jié)構(gòu)500中。此外,如上所述,在其它可替代的實施例中,客戶機504、服務器502、和服務器503的硬件和軟件配置如下面所描述的和圖8所示的那樣。RARMI存根模塊580是一種能夠根據(jù)負載平衡方法507和/或故障處理方法508找出幾乎所有服務提供者并在它們之間切換的智能存根模塊。在一個實施例中,RA存根模塊580包括選擇適當負載平衡方法507和/或故障處理方法507的復制處理器506。在其它可替代的實施例中,可以實施單負載平衡方法和/或單故障處理方法。在其它可替代的實施例中,復制處理器506可以包括多負載平衡方法和/或多故障處理方法以及它們的組合。在一個實施例中,復制處理器506實現(xiàn)如下接口<prelisting-type="program-listing"><![CDATA[publicinterfaceReplicaHandler{ObjectloadBalance(ObjectcurrentProvider)throwsRefreshAbortedException;ObjectfailOver(ObjectfailedProvider,RemoteExceptione)throwsRemoteException;}]]></pre>緊接調(diào)用一種方法之前,RA存根模塊580調(diào)用負載平衡方法507,它接管當前服務器,并返回替換者。例如,客戶機504可能正在利用服務器502檢索數(shù)據(jù)庫509a或個人存儲裝置509的數(shù)據(jù)。由于服務器502負擔服務請求過重,因此,負載平衡方法507可以切換到服務器503。處理器506可能選擇完全在調(diào)用方上的服務器替換者,也許利用關(guān)于服務器502負載的信息,或者,處理器506可以請求服務器506檢索特定類型的數(shù)據(jù)。例如,處理器506可以選擇特定服務器解方程,因為服務器已經(jīng)提高了計算能力。在一個實施例中,復制處理器506實際上不需要在每次調(diào)用時都切換提供者,因為復制處理器506正試圖使創(chuàng)建的連接數(shù)最少。圖6a是說明圖5a-b所示的負載平衡軟件507的控制流程圖。應該理解,圖6a是說明由負載平衡方法507中的軟件完成的功能或步驟的邏輯序列的控制流程圖。在其它可替代的實施例中,可以完成附加的功能或步驟。并且,在其它可替代的實施例中,硬件可以執(zhí)行特定的功能或所有的功能。負載平衡軟件507從圓圈600所示的位置開始。然后,在邏輯塊601中確定調(diào)用線程是否已經(jīng)建立起對特定服務器的“親緣關(guān)系”??蛻魴C與協(xié)調(diào)它當前事務處理的服務器有親緣關(guān)系,和服務器與它自己有親緣關(guān)系。如果親緣關(guān)系已建立,則將控制進到邏輯塊602,否則,則控制進到邏輯塊604。在邏輯塊602中確定有親緣關(guān)系的服務器是否提供所請求的服務。如果是,則將控制進到邏輯塊603。否則,則控制進到邏輯塊604。將有親緣關(guān)系的服務器上的服務提供者返回給邏輯塊603中的客戶機。在邏輯塊604中,聯(lián)系命名服務并獲取更新了的當前服務提供者列表。在邏輯塊605中調(diào)用getNextProvider(取下一服務者)方法以獲取服務提供者。getNextProvider方法的各種實施例顯示在圖6b-g中,下面將作詳細描述。在邏輯塊606中獲得服務。然后,如果在邏輯塊606中沒有提供服務,則調(diào)用故障處理方法508,最后,負載平衡方法507從邏輯塊608所示的位置退出。故障處理方法508的實施例表示在圖7中,下面將作詳細描述。圖6b-g示出了圖6a的邏輯塊605中所使用的getNextProvider方法的各種實施例。如圖6b所示,getNextProvider方法以循環(huán)方式選擇服務提供者。如圓圈621所示進入getNextProvider方法620。在邏輯塊622中獲取當前服務提供者列表。在邏輯塊623中遞增指針。在邏輯塊624中根據(jù)指針選擇下一個服務提供者,并在邏輯塊625中返回新的服務提供者,最后,如圓圈626所示退出getNextProvider方法。圖6c示出了通過隨機選擇服務提供者來獲取服務提供者的getNextProvider方法的另一種可替代實施例。如圓圈631所示進入getNextProvider方法630。如邏輯塊632所示的那樣獲取當前服務提供者列表。如邏輯塊633所示的那樣隨機選擇下一個服務提供者,并在邏輯塊634中返回新的服務提供者,最后,如圓圈635所示退出getNextProvider方法。getNextProvider方法還有一個實施例顯示在圖6d中,它根據(jù)各服務提供者的負載獲取服務提供者。如圓圈641所示進入getNextProvider方法640。在邏輯塊642中獲取當前服務提供者列表。在邏輯塊643中獲取每個服務提供者的負載。然后,在邏輯塊644中選擇負載最輕的服務提供者。最后,在邏輯塊645中返回新的服務提供者,并且如圓圈646所示退出getNextProvider方法。getNextProvider方法的再一個可替代的實施例顯示在圖6e中,它根據(jù)從服務提供者獲得的數(shù)據(jù)類型獲取服務提供者。如圓圈651所示進入getNextProvider方法650。在邏輯塊652中獲取當前服務提供者列表。在邏輯塊653中確定從服務提供者請求的數(shù)據(jù)的類型。然后,在邏輯塊654中根據(jù)數(shù)據(jù)類型選擇負載服務提供者。最后,在邏輯塊655中返回新的服務提供者,并且如圓圈656所示退出getNextProvider方法。getNextProvider方法的再一個實施例表示在圖6f中,它根據(jù)服務提供者物理位置選擇服務提供者。如圓圈661所示進入getNextProvider方法660。在邏輯塊662中獲取當前服務提供者列表。在邏輯塊663中確定到每個服務提供者的物理距離,和在邏輯塊664中選擇到正在請求的客戶機的物理距離最近的服務提供者。最后,在邏輯塊665中返回新的服務提供者,并且如圓圈666所示退出getNextProvider方法660。getNextProvider方法的還在一個的實施例顯示在圖6g中,它根據(jù)服務提供者響應以前的請求所花費的時間量選擇服務提供者。如圓圈671所示進入getNextProvider方法670的控制。在邏輯塊672中獲取當前服務提供者列表。在邏輯塊673中確定每個服務提供者響應特定消息的時間間隔。然后,在邏輯塊674中選擇以最短時間間隔響應的服務提供者。最后,在邏輯塊675中返回新的服務提供者,并且如圓圈676所示退出來自getNextProvider方法的控制。如果服務方法的調(diào)用以保證重試這樣的方式出故障,則RA存根模塊580調(diào)用故障處理方法508,它接管發(fā)生故障的服務器和提示是什么故障的異常,并返回一重試用的新服務器。如果新服務器不適用,則RA存根模塊580報告異常。圖7是說明圖5a-b所示的故障處理軟件508的控制流程圖。如圓圈700所示進入故障處理方法508。在邏輯塊701從服務的當前提供者列表中刪除發(fā)生故障的提供者。然后,調(diào)用getNextProvider方法以便獲取服務提供者。最后,在邏輯塊703中返回新的服務提供者,和如圓圈704所示退出故障處理方法508。雖然圖6-7表示復制處理器506的實施例,但其它可替代的實施例還包括以循環(huán)方式實現(xiàn)的如下功能或它們的組合。首先,要維護服務的服務器或服務提供者的列表。每當列表需要使用和列表最近沒有被更新時,處理器506就聯(lián)系如下所述的命名服務并獲取提供者的最新列表。其次,如果處理器506打算從列表中選擇提供者和存在到主服務器的現(xiàn)存的RJVM級連接,該主服務器在最后的心跳周期未接收到消息,則處理器506跳過該提供者。在一個實施例中,由于對等的消失是在幾個這樣的心跳間隔之后確定的,因此,服務器可以在以后恢復。這樣,就可以獲取基于服務器負載的負載平衡。第三,當提供者發(fā)生故障時,處理器506從列表中刪除該提供者。這樣就避免了重復嘗試使用不工作的服務提供者所引起的延遲。第四,如果服務正在從作為服務的提供者的宿主的服務器調(diào)用的,那么就使用該提供者。這有利于鏈式調(diào)用服務的提供者的共置托管(co-location)。第五,如果服務正在在事務處理的范圍內(nèi)被調(diào)用和起事務處理協(xié)調(diào)者作用的服務器作為服務的提供者的宿主,那么就使用該提供者。這有利于在事務處理范圍內(nèi)的提供者的共置托管。能夠在方法調(diào)用期間發(fā)生的故障可以分類成(1)與應用程序有關(guān)的、或(2)與基礎設施有關(guān)的。在發(fā)生與應用程序有關(guān)的故障的情況下,RA存根模塊580將不重試操作,因為不能期望改善這種情況。在發(fā)生與基礎設施有關(guān)的故障的情況下,RA存根模塊580也許能夠,或也許不能夠可靠地重試操作。一些初始非冪等操作,例如遞增數(shù)據(jù)庫中字段的值,可能完成。在一個實施例中,只有當(1)用戶已經(jīng)聲明服務方法是冪等的,或者(2)系統(tǒng)可以確定請求的處理從未開始。作為后者的一個例子,如果作為負載平衡方法的一部分,存根模塊580切換到其宿主已經(jīng)發(fā)生故障的服務提供者,RA存根模塊580將重試。作為另一個例子,RA存根模塊580得到對事務處理操作的否定確認,則RA存根模塊580將重試。RMI編譯器識別命令該編譯器生成用于對象的RA存根模塊的特殊標志。附加的標志可以用于規(guī)定服務方法是冪等的(idempotent)。在一個實施例中,RA存根模塊580將利用如上所述的和圖5a所示的復制處理器。附加的標志可以用于規(guī)定不同的處理器。另外,在服務被布置的點上,即被結(jié)合在如下所述的集團型命名服務的點上,處理器可以被取代。圖5b表示本發(fā)明的另一個實施例,其中EJB對象551用于取代圖5a所示的存根模塊。III.復制的遵從JNDI的命令服務如圖4所示,對結(jié)構(gòu)400中的服務提供者的訪問是通過遵從JNDI的命名服務獲得的,在整個結(jié)構(gòu)400中復制遵從JNDI的命令服務,使得不存在任何單個故障點。因此,如果提供遵從JNDI的命名服務的處理設備發(fā)生了故障,則可以使用具有復制的命名服務的另一個處理設備。為了提供服務的示例,服務器在復制命名樹中的特定節(jié)點上通告服務的提供者。在一個實施例中,每個服務器將用于提供者的RA存根模塊附加到存儲在命名樹的服務器備份中的節(jié)點上的兼容服務庫。如果新提供(offer)的類型與現(xiàn)有庫中提供的類型不兼容,則使新提供暫停,并通過ConflictHandler接口作出往調(diào)用(callback)。在撤消任一種類型的提供之后,另一種提供將最終被裝在每一處。當客戶機查找服務時,客戶機獲取聯(lián)系服務庫的RA存根模塊以刷新服務提供者的客戶機列表。圖4表示結(jié)構(gòu)400中復制的命名服務。在一個實施例中,服務器302和303分別提供示例的服務提供者P1和P2,并且分別擁有命名服務樹402和403的復制品。命名服務樹402和403中的節(jié)點acme.eng.example分別擁有服務庫402a和403a,包含到Example服務提供者P1和P2的參考點??蛻魴C304通過在acme.eng.example節(jié)點上進行命名服務查找獲取RA存根模塊304e。存根模塊304e聯(lián)系服務庫的示例以獲取到可用服務提供者的參考點的當前列表。存根模塊304e可以按負載平衡和故障處理的需要在服務庫的示例之間切換。關(guān)于命名服務的初始上下文的存根模塊是知曉復制的或智能的存根模塊,它最初作命名服務提供者之間的負載平衡,并在發(fā)生故障的情況下進行切換。命名服務樹的每個示例包含當前命名服務提供者的完整列表。存根模塊從當前正在使用的示例中獲取刷新列表。為了引導這個處理,系統(tǒng)使用DomainNamingService(域名命名服務)(“DNS”)以找出示例的(可能不完整的)初始列表和從它們之一中獲取完整列表。舉例來說,可以按如下獲取關(guān)于于命名服務的初始上下文的存根模塊<prelisting-type="program-listing"><![CDATA[Hashtableenv=newHashtable();env.put(Context.PROVIDER_URL,“t3//acmeCluster7001”);env.put(Context.INITIAL-CONTEXT_FACTORY,“weblogic.jndi.WebLogiclnitialContextFactor”);Contextctx=newInitialContext(env);]]></pre>結(jié)構(gòu)中的一些分組服務器已經(jīng)被約束在名稱acmeCluster下的DNS中。并且,應用程序仍然能夠規(guī)定各個服務器的地址,但是,當應用程序首先試圖獲取存根模塊時,應用程序?qū)⒋嬖趩蝹€故障點??煽康亩帱c傳送協(xié)議是所期望的。在一個實施例中,通過IP多點傳送或點到點協(xié)議分配提供者存根,并創(chuàng)建復制的命名樹。在IP多點傳送實施例中,有三種類型的消息Heartbeat、Announcement(通知)、StateDump(狀態(tài)轉(zhuǎn)儲)。Heartbeat用于在服務器之間傳輸信息,和通過它們的存在與否,識別發(fā)生故障的服務器。Announcement包含一組服務的提供和撤消。來自每個服務器的Announcement按順序編號。每個接收器處理Announcement以便識別丟失的Announcement。每個服務器在它的Heartbeat中包括已經(jīng)發(fā)送的最后一個Announcement的序號。關(guān)于丟失的Announcement的NegativeAcknowledgement(“NAK”,否認)包括在隨后輸出的Heartbeat中。為了處理NAK,每個服務器都保留服務器已經(jīng)發(fā)送的最后幾個Announcement的列表。如果關(guān)于Announcement已經(jīng)被刪除的NAK到達,服務器就發(fā)送StateDump,它包含服務器的服務的完整列表和它下一個Announcement的序號。當新服務器加入到現(xiàn)有的結(jié)構(gòu)中時,新服務器NAK(否認)來自每個其它服務器的第一消息,這導致StateDump被發(fā)送。如果服務器在預定時間間隔之后沒有從另一個服務器接收到心跳(Heartbeat),則服務器撤消由沒有產(chǎn)生心跳(Heartbeat)的服務器提供的所有服務。IV.編程模型用在圖3-5所示的結(jié)構(gòu)中的應用程序隨要處理應用程序狀態(tài)的方式而定使用三種基本編程模型之一(1)無狀態(tài)的或直接的、(2)無狀態(tài)工廠(statelessfactory)的或間接的、或(3)有狀態(tài)的或有目標的。在無狀態(tài)模型中,通過命名服務查查找表返回的智能存根模塊直接參考服務提供者。<prelisting-type="program-listing"><![CDATA[Examplee=(Example)ctx.lookup(“acme.eng.example”);result1=e.example(37);result2=e.example(38);]]></pre>在該例中,由于為了負載平衡,智能存根模塊能夠在不同的服務提供者之間切換,因此,對實例的兩種調(diào)用可以由不同的服務提供者來處理。因此,Example服務對象不能夠代表應用程序在內(nèi)部存儲信息。通常,只有當提供者無狀態(tài)時,才使用無狀態(tài)模型。舉例來說,純粹無狀態(tài)提供者可以計算其變元的一些數(shù)學函數(shù),并返回結(jié)果。無狀態(tài)提供者可以為它們自己存儲信息,例如為了財會的目的。更重要的是,無狀態(tài)提供者可以訪問底層的永久性存儲器,和根據(jù)需要將應用程序的狀態(tài)裝入存儲器中。例如,為了使實例返回作為變元進入其中的所有值的運行和。該實例可以從數(shù)據(jù)庫中讀取以前的和,加入它的當前的變元中,寫出新的值,然后將其返回。這種無狀態(tài)服務模型提高了規(guī)??缮炜s性。在無狀態(tài)工廠編程模型中,通過查找返回的智能存根模塊是創(chuàng)建其自身不是智能存根模塊的所需服務提供者的工廠。<prelisting-type="program-listing"><![CDATA[ExampleFactorygf=(ExampleFactory)ctx.lookup(“acme.eng.example”);Examplee=gf.create();result1=e.example(37);result2=e.example(38);]]></pre>在該例中,確保對實例的兩種調(diào)用由同一服務提供者來處理。因此,服務提供者可以代表應用程序可靠地存儲信息。無狀態(tài)工廠模型應該應用在調(diào)用者需要與提供者進行“對話”時,例如,調(diào)用者和提供者可以進行往復協(xié)商。知曉復制的存根模塊一般與無狀態(tài)和無狀態(tài)工廠模型中的相同。唯一不同之處在于存根模塊是涉及服務提供者,還是涉及服務提供者工廠。提供者工廠存根模塊在努力創(chuàng)建提供者的過程中可以隨意地進行故障處理,因為這種操作是冪等的。為了進一步提高間接服務的可用性,應用程序代碼必須包含圍繞服務創(chuàng)建和調(diào)用的顯式重試循環(huán)。<prelisting-type="program-listing"><![CDATA[while(true){try{Examplee=gf.create();result1=e.example(37);result2=e.example(38);break;}catch(Exceptione){if(!retryWarranred(e))throwe;}}]]></pre>這將會,例如,處理由工廠成功創(chuàng)建的提供者e的故障。在這種情況下,應用程序代碼應該確定是否完成非冪等操作。為了進一步提高適用性,應用程序代碼可以嘗試取消這樣的操作并重試。在有狀態(tài)編程模型中,服務提供者是由一些唯一系統(tǒng)級關(guān)鍵字標識的長壽命、有狀態(tài)對象。可以利用這種模型訪問的“實體”的例子包括遠程文件系統(tǒng)和數(shù)據(jù)庫表中的行。目標提供者可以由許多客戶機訪問許多次,這與每個提供者只由一個客戶機使用一次的其它兩種模型不同。用于目標提供者的存根模塊可以通過關(guān)鍵字只不過是命名服務名稱的直接查找表,或通過關(guān)鍵字包括對創(chuàng)建操作的變元的工廠兩者之一獲取。在每一種情況中,存根模塊將不作負載平衡或故障處理。即使作的話,重試必須再次顯式地獲取存根模塊。在EJB中存在三種類型的豆模塊,其中的每一種映射到三種編程模型之一。無狀態(tài)會話豆模塊(bean)是為特定調(diào)用者創(chuàng)建的,但在調(diào)用之間不保持內(nèi)部狀態(tài)。無狀態(tài)會話豆模塊映射到無狀態(tài)模型。有狀態(tài)會話豆模塊是為特定調(diào)用者創(chuàng)建的,并在調(diào)用之間保持內(nèi)部狀態(tài)。有狀態(tài)會話豆模塊映射到無狀態(tài)工廠模型。實體豆模塊是由全系統(tǒng)關(guān)鍵字標識的奇異的、有狀態(tài)對象。實體豆模塊映射到有狀態(tài)模型。所有三種類型的豆模塊都由稱為EJB家庭(home)的工廠創(chuàng)建的。在一個實施例中,它們創(chuàng)建的EJB家庭和豆模塊兩者都用RMI標記。在圖3-5所示的結(jié)構(gòu)中,用于EJB家庭的存根模塊是智能存根模塊。用于無狀態(tài)會話豆模塊的存根模塊是智能存根模塊,而用于有狀態(tài)會話豆模塊和實體豆模塊的存根模塊則不是。用于基于EJB的服務的復制處理器可以在它的布置(deplotment)描述符中規(guī)定。為了創(chuàng)建間接的、基于RMI的服務,這是當對象要為調(diào)用者保持狀態(tài)時所需要的,應用程序代碼必須顯式地構(gòu)建工廠。有目標的、基于RMI的服務可以通過無需任何特殊標志地運行RMI編譯器,然后將所得的服務結(jié)合到所復制的命名樹中來創(chuàng)建。用于對象的存根模塊將直接結(jié)合到命名樹的每個示例中和將不創(chuàng)建任何服務庫。這樣就提供了關(guān)鍵字是命名服務名稱的有目標服務。在一個實施例中,這用于創(chuàng)建遠程文件系統(tǒng)。V.硬件和軟件部分圖8表示圖3-5所示的示例性服務器和/或客戶機的硬件和軟件部分。圖8的系統(tǒng)包括通用計算機800,它通過諸如連接829之類的一個或多個通信媒體與LAN840,并且也與在這里如因特網(wǎng)880所示的WAN相連接。通過LAN840,計算機800可以與諸如文件服務器841之類的其它本地計算機通信。在一個實施例中,文件服務器841是如圖3所示的服務器303。通過因特網(wǎng)880,計算機800可以與諸如萬維網(wǎng)服務器881之類的、本地的和遠程的其它計算機通信。在一個實施例中,萬維網(wǎng)服務器881是如圖3所示的服務器303。應該理解,從計算機800到因特網(wǎng)880的連接可以通過各種各樣的方式實現(xiàn),例如,直接通過連接829,通過局域網(wǎng)840,或通過調(diào)制解調(diào)器(圖中未示出)。計算機800是個人或辦公用計算機,它們可以是,例如,工作站、個人計算機、或其它單用戶或多用戶系統(tǒng);一個示例性的實施例使用了SunSPARC-20工作站(SunMicrosystems,Inc.,MountainView,CA)。為了便于說明,可以將計算機800方便地劃分成硬件部分801和軟件部分802;但是,本領(lǐng)域的普通技術(shù)人員應該理解,這種劃分是概念性的,并且多少有些隨意性,在硬件和軟件之間的界線也不是嚴格的。此外,應該理解,在主計算機與它的附屬外設之間的界線也不是嚴格的,尤其是,被認為是一些計算機的外設的部分也可以被認為是其它計算機的整體部分。因此,例如,用戶I/O820可以包括鍵盤、鼠標、和顯示監(jiān)視器,它們的每一種既可以被認為是外圍設備,也可以被認為是計算機本身的一部分,用戶I/O820還可以包括通常被認為是外設的本機打印機。作為另一個例子,永久性存儲器808可以包括CD-ROM(光盤只讀存儲器)單元,它既可以是外設,也可以內(nèi)置在計算機中。硬件部分801包括處理器(CPU)805、存儲器806、永久性存儲器件808、用戶I/O820、和網(wǎng)絡接口825,它們都與總線810連接。這些部分都是本領(lǐng)域的普通技術(shù)人員所熟知的,因此,只需作簡要說明。處理器805可以是,例如,微處理器、或為了多重處理而構(gòu)成的微處理器的集合。存儲器806可以包括只讀存儲器(ROM)、隨機訪問存儲器(RAM)、虛擬存儲器、或其它存儲技術(shù),它們既可以是單個形式,也可以是組合形式。永久性存儲器件808可以包括,例如,硬磁盤、軟磁盤、或其它永久性讀-寫數(shù)據(jù)存儲技術(shù),它們既可以是單個形式,也可以是組合形式。它還可以包括大型或歸檔存儲器件,例如可以通過CD-ROM或其它大容量存儲技術(shù)提供的那種。(請注意,文件服務器841提供了處理器805可以利用的附加存儲能力。)用戶I/O(輸入/輸出)硬件820通常包括諸如CRT或平板顯示器之類的視頻顯示監(jiān)視器、字母數(shù)字式鍵盤、和鼠標或其它點擊設備,可選地,還可以包括打印機、光學掃描儀,或供用戶輸入輸出用的其它設備。網(wǎng)絡I/O硬件825提供了計算機800和外界的接口。更明確地說,網(wǎng)絡I/O硬件825讓處理器805通過連接829與通過LAN840和因特網(wǎng)880的其它處理器和設備通信。軟件部分802包括操作系統(tǒng)850和在操作系統(tǒng)310控制下的一組任務,例如,JavaTM應用程序860、和重要的是,JVM軟件354和核心模塊355。操作系統(tǒng)310還讓處理器805控制諸如永久性存儲器件808、用戶I/O820、和網(wǎng)絡接口825之類的各種設備。處理器805與存儲器806和計算機系統(tǒng)800的其它部分相聯(lián)系執(zhí)行操作系統(tǒng)310、應用860、JVM354、和核心355的軟件。在一個實施例中,軟件802包括如圖3c的服務器302中所示的網(wǎng)絡軟件302a、JVM1、RJVM2和RJVM3。在一個實施例中,JavaTM應用程序860是如圖3c所示的JavaTM應用程序302c。本領(lǐng)域的普通技術(shù)人員應該理解,圖8的系統(tǒng)的意圖是用于舉例說明的,而不是用于限制的,各種各樣計算、通信、和信息設備都可以用來取代或附加到圖8所表示的設備上。例如,通過因特網(wǎng)880的連接一般涉及通過中間路由器計算機(未示出)的分組交換,和計算機800在典型的萬維網(wǎng)客戶機會話期間可能訪問任何數(shù)量的萬維網(wǎng)服務器,包括,但決不僅限于,計算機800和萬維網(wǎng)服務器881。上述對本發(fā)明優(yōu)選實施例的說明是為了圖示和描述的目的而提供的。它不是窮舉的,或?qū)⒈景l(fā)明限制在所公開的精確形式上。顯然,各種改進和變動對于本領(lǐng)域的普通技術(shù)人員來說是顯而易見的。選擇和描述實施例是為了最佳地解釋本發(fā)明的原理和它的實際應用,從而使本領(lǐng)域的其它普通技術(shù)人員能夠理解有關(guān)各種實施例的和包括適用于所設想的特定用途的各種改進在內(nèi)的本發(fā)明。應采用下列權(quán)利要求和它們的等效物來限定本發(fā)明的范圍。權(quán)利要求1.一種設備,包括通信媒體;與通信媒體連接的第一處理設備,含有命名服務;和與通信媒體連接的第二處理設備,含有復制的命名服務。2.如權(quán)利要求1所述的設備,其中命名服務是遵從JNDI的命名服務。3.如權(quán)利要求1所述的設備,其中復制的命名服務在第一命名服務發(fā)生故障的時候可用。4.如權(quán)利要求1所述的設備,其中第一命名服務包括命名樹,該命名樹含有包含服務庫的節(jié)點,和其中復制的命名服務包括復制的命名樹。5.如權(quán)利要求4所述的設備,其中服務庫包括服務提供者的當前列表。6.如權(quán)利要求5所述的設備,其中第一處理設備包括服務提供者列表中的一個服務提供者。7.如權(quán)利要求4所述的設備,其中服務庫包括存根模塊。8.如權(quán)利要求1所述的設備,其中命名服務和復制命名服務由多點發(fā)送程序創(chuàng)建。9.如權(quán)利要求1所述的設備,其中第一處理設備包括含有復制處理器的第一存根模塊,和第二處理設備包括含有第二復制處理器的第二存根模塊。10.一種分布式處理系統(tǒng),包括通信媒體;與通信媒體連接的第一計算機,含有一命名樹,包含用于訪問服務提供者用的遠程方法調(diào)用(RMI)存根模塊;和與通信媒體連接的第二計算機,含有復制的命名樹和所述服務提供者。11.如權(quán)利要求10所述的分布式處理系統(tǒng),其中第一計算機包括將消息傳送到第二計算機中的第二核心模塊的第一核心模塊。12.如權(quán)利要求11所述的分布式處理系統(tǒng),其中第一核心模塊包括遠程JavaTM虛擬機和第二核心模塊包括遠程JavaTM虛擬機。13.如權(quán)利要求11所述的分布式處理系統(tǒng),其中第一核心模塊包括線程處理器軟件部分。14.如權(quán)利要求11所述的分布式處理系統(tǒng),其中第一核心模塊包括接頭處理器軟件部分。15.如權(quán)利要求12所述的分布式處理系統(tǒng),其中第一遠程JavaTM虛擬機包括對等消失檢測軟件部分。16.如權(quán)利要求12所述的分布式處理系統(tǒng),其中第一遠程JavaTM虛擬機包括消息壓縮軟件部分。全文摘要本發(fā)明提供了一種集團型企業(yè)Java文檔編號G06F15/177GK1338074SQ99814677公開日2002年2月27日申請日期1999年10月21日優(yōu)先權(quán)日1998年11月5日發(fā)明者迪安·B·雅各布斯,埃里克·M·哈爾彭申請人:Bea系統(tǒng)公司