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