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