CORBA(Common Object Request Broker Architecture,公用對象請求代理體系結構)是 Object Management Group (OMG) 協(xié)會(huì )開(kāi)發(fā)的標準分布式對象體系結構。自 1989 年以來(lái),OMG 的任務(wù)就是為開(kāi)放式軟件總線(xiàn)或對象請求代理(Object Request Broker,ORB)提供體系結構規范。以此為基礎,不同廠(chǎng)商編寫(xiě)的對象組件可跨過(guò)網(wǎng)絡(luò )和操作系統實(shí)現互操作。該標準允許 CORBA 對象相互調用,而無(wú)需知道所訪(fǎng)問(wèn)對象的位置或實(shí)現被請求對象所用的語(yǔ)言。OMG 指定的接口定義語(yǔ)言(Interface Definition Language,IDL)用于為 CORBA 對象定義接口。
CORBA 對象與典型編程語(yǔ)言對象的不同之處在于:
Java IDL 是同 JDK 1.2 一起提供的對象請求代理。它可與 idltojava 編譯器(可從 Java Developer Connection 下載)一起用于定義、實(shí)現和訪(fǎng)問(wèn)用 Java 編程語(yǔ)言編寫(xiě)的 CORBA 對象。Java IDL 符合 CORBA/IIOP 2.0 規范 (orbos/97-02-25) 和 IDL-to-Java 語(yǔ)言映射(orbos/98-01-06 終版)標準。
Java IDL ORB 支持瞬態(tài) CORBA 對象 - 該對象的生命期受服務(wù)器進(jìn)程生命期的限制。Java IDL 也提供瞬態(tài)名字服務(wù)器,以便將對象組織為樹(shù)型目錄結構。名字服務(wù)器符合在 CORBAservices:通用對象服務(wù)規范中所述的命名服務(wù)規范標準。瞬態(tài)對象及名字服務(wù)器將在下文中討論。
接口庫并不是作為 Java IDL 的組成部分來(lái)提供的。由于一般情況下客戶(hù)機可訪(fǎng)問(wèn)已生成的 stub 文件,因此不需要接口庫。Nutshell 中的 CORBA 概念
本節引入的概念在 CORBA/IIOP 2.0 規范中有更全面的論述。
下圖展示從客戶(hù)機傳送到服務(wù)器 CORBA 對象實(shí)現的方法請求??蛻?hù)機是調用 CORBA 對象上某方法的任意代碼(其本身也可能是 CORBA 對象)。servant 是對象實(shí)現的實(shí)例 - 實(shí)現該 CORBA 對象的實(shí)際代碼和數據。

CORBA 對象的客戶(hù)機具有對該對象的對象引用,并用該對象引用來(lái)發(fā)出方法請求。如果該服務(wù)器對象是遠程對象,則對象引用將指向 stub 函數,該函數則使用 ORB 機制向服務(wù)器對象傳送調用。stub 代碼使用 ORB 來(lái)標識運行該服務(wù)器對象的計算機,并且向該計算機的 ORB 請求與該對象服務(wù)器連接。stub 代碼取得該連接時(shí),會(huì )將對象引用和參數發(fā)送到鏈接目標對象實(shí)現的 skeleton 代碼。skeleton 代碼將該調用和參數變換為所需的、與實(shí)現有關(guān)的格式,然后調用該對象。任何結果或異常都會(huì )沿同一路徑返回。
客戶(hù)機不知 CORBA 對象的位置、實(shí)現詳情及用來(lái)訪(fǎng)問(wèn)該對象的 ORB。不同的 ORB 通過(guò)由 OMG 指定的 Internet InterORB 協(xié)議 (IIOP) 通訊。[CORBA/IIOP 2.0:ch 9,10]
客戶(hù)機只能調用在 CORBA 對象接口中指定的方法。CORBA 對象接口通過(guò) OMG 接口定義語(yǔ)言 (IDL) [CORBA/IIOP 2.0 ch3] 進(jìn)行定義。接口定義對象類(lèi)型,同時(shí)指定一組已命名的方法和參數及這些方法可能返回的異常類(lèi)型。IDL 編譯器(如 idltojava )可依照相應的 OMG 語(yǔ)言映射將 CORBA 對象定義翻譯為指定的編程語(yǔ)言。因此,idltojava 編譯器將依照 IDL-Java 語(yǔ)言映射將 IDL 定義翻譯為 Java 結構。
idltojava 編譯器為每個(gè)對象類(lèi)型都生成 stub 和 skeleton 文件。stub 文件為客戶(hù)機提供用客戶(hù)機編程語(yǔ)言表示的對 IDL 定義的方法的訪(fǎng)問(wèn)。服務(wù)器 skeleton 文件將對象實(shí)現粘合到 ORB 運行時(shí),ORB 使用 skeleton 將方法分配給對象實(shí)現實(shí)例 (servants)。定義并實(shí)現 CORBA 對象
開(kāi)發(fā) CORBA 對象的目的是創(chuàng )建并注冊對象服務(wù)器或普通服務(wù)器。服務(wù)器是一個(gè)程序,其中包含一個(gè)或多個(gè)對象類(lèi)型的實(shí)現并注冊到 ORB。例如,用戶(hù)可以開(kāi)發(fā)一個(gè)桌面排版服務(wù)器,實(shí)現“Document”對象類(lèi)型、“Paragraph”對象類(lèi)型及其它相關(guān)的對象類(lèi)型。
所有 CORBA 對象都支持定義對象類(lèi)型的 IDL 接口。一個(gè)接口可繼承一個(gè)或多個(gè)其它接口。IDL 語(yǔ)法與 Java 或 C++ 非常相似,CORBA 的 IDL 文件在功能方面與語(yǔ)言無(wú)關(guān),類(lèi)似于 C++ 頭文件。將 IDL 映射到每個(gè)編程語(yǔ)言后,即可提供從該語(yǔ)言到對象接口的訪(fǎng)問(wèn)。有了 Java IDL,這些 IDL 接口可用 idltojava 編譯器翻譯為 Java。對于每個(gè) IDL 接口,idltojava 都生成 Java 接口以及其它所需的 .java 文件,包括客戶(hù)機 stub 和服務(wù)器 skeleton。
IDL 接口聲明一組客戶(hù)機可訪(fǎng)問(wèn)的操作、異常及有類(lèi)型的屬性(值)。每個(gè)操作都有一個(gè)說(shuō)明定義操作的名稱(chēng)、參數、結果及異常。以下為描述經(jīng)典“Hello World”程序的簡(jiǎn)單 IDL 接口。
module HelloApp{interface Hello{string sayHello();};};當出現錯誤條件時(shí),操作會(huì )拋出異常。異常的類(lèi)型表明了所遇到的錯誤種類(lèi)。除正常結果外,客戶(hù)機還必須準備處理每個(gè)操作的已定義異常和 CORBA 標準異常。
一旦定義了 IDL 接口,且 idltojava 編譯器基于 .idl 文件運行,就可編寫(xiě)包含方法實(shí)現的 .java 文件。而后,.java 實(shí)現文件即可被編譯并鏈接到 idltojava 生成的 .java 文件和 ORB 庫,以便創(chuàng )建對象服務(wù)器。
對象實(shí)現將為它所支持的接口的所有操作和屬性定義行為。一個(gè)接口可能有多個(gè)實(shí)現(例如每個(gè)實(shí)現都用來(lái)強調特定的時(shí)間和空間權衡)。實(shí)現定義創(chuàng )建/破壞接口和對象的行為。
由于只有服務(wù)器能創(chuàng )建新的 CORBA 對象,因此應為每種對象類(lèi)型定義并實(shí)現工廠(chǎng)對象接口。例如,如果一種對象類(lèi)型為 Document,則帶有 create 方法的 DocumentFactory 對象類(lèi)型將作為服務(wù)器的一部分來(lái)定義和實(shí)現(注意,“create”不是保留的,可以用任何方法名)。而后,create 方法的實(shí)現可用 new 來(lái)創(chuàng )建對象。例如:
DocumentServant document = new DocumentServant():orb.connect(document);
可在 Document 上定義并實(shí)現 destroy 方法,或者該對象可無(wú)限延續(注意,“destroy”不是保留的,因此可使用任何名稱(chēng))。
Java IDL ORB 只支持瞬態(tài)對象,其生命期受服務(wù)器進(jìn)程生命期的限制。雖然當服務(wù)器進(jìn)程終止運行時(shí)瞬態(tài)對象也會(huì )消失,但該對象的實(shí)現可以來(lái)將其狀態(tài)保存到文件中,并在創(chuàng )建時(shí)從該文件重新初始化。客戶(hù)機實(shí)現
客戶(hù)機代碼與 idltojava 生成的 .java 文件和 ORB 庫鏈接。在 Hello World 實(shí)例中提供了應用程序和applet客戶(hù)機的示例。
客戶(hù)機只可使用服務(wù)器提供的已公布工廠(chǎng)接口來(lái)創(chuàng )建 CORBA 對象。同樣,只有該對象公布一個(gè)破壞方法,客戶(hù)機才能刪除 CORBA 對象。由于一個(gè) CORBA 對象可能為網(wǎng)絡(luò )上的很多客戶(hù)機所共享,因此,只有對象服務(wù)器才能夠知道該對象何時(shí)成為垃圾。
客戶(hù)機代碼在 CORBA 對象上發(fā)送方法請求的唯一方式是經(jīng)由該對象的對象引用。對象引用是不透明結構,它標識 CORBA 對象的主機、主機服務(wù)器監聽(tīng)請求的端口及在進(jìn)程中指定對象的指針。因為 Java IDL 只支持瞬態(tài)對象,所以在服務(wù)器進(jìn)程終止并重啟時(shí)該對象引用將無(wú)效。
客戶(hù)機一般以如下方式獲得對象引用:
一旦獲得對象引用,客戶(hù)機必須將它限定為適當類(lèi)型。IDL 支持繼承,其繼承的根目錄為 IDL 中的 Object,即 Java 中的 org.omg.CORBA.Object(org.omg.CORBA.Object 自然是 java.lang.Object 的子類(lèi))。某些操作(特別是名稱(chēng)查詢(xún)和解串)返回使用 idltojava 編譯器生成的幫助類(lèi)可將其限定為所期望的派生類(lèi) org.omg.CORBA.Object。由于 Java 運行時(shí)無(wú)法總是知道 CORBA 對象的確切類(lèi)型,因此必須顯式地限定 CORBA 對象類(lèi)型。
Java IDL Transient Nameservice 是同 Java IDL 一起提供的對象服務(wù)器。在命令行提示中使用 tnameserv 可以啟動(dòng)此名字服務(wù)器。本對象服務(wù)器符合在本頁(yè)中先前部分所述的標準對象實(shí)現及調用技術(shù)。
名字服務(wù)器通過(guò)與文件目錄相似的樹(shù)型結構按名稱(chēng)存儲對象引用??蛻?hù)機可通過(guò)名稱(chēng)查找或解析對象引用。因為名字服務(wù)器是一種普通的 Java IDL 瞬態(tài)服務(wù)器,所以每次 tnameserv 終止運行時(shí),整個(gè)名稱(chēng)目錄結構都會(huì )丟失。
有關(guān)詳細信息,參見(jiàn)命名服務(wù)。
分布式應用程序似的概念
| 使用 CORBA | 詞匯表版權所有©
1996-98 Sun Microsystems, Inc., 2550 Garcia Ave., Mtn. View, CA. 94043-1100 USA.,保留所有權利。聯(lián)系客服