由OMG制訂的對象相互操作規範通常稱為“對象管理體系”(ObjectManagement Architecture,OMA)。OMA定義了兩個組件:“核心物件模型”(Core Object Model)和“OMA參考體系”(OMA Reference Model)。OMA參考體系定義了一套基層服務結構及機制,實現了對象相互間進行操作的能力。OMA參考體系包括“對象請求代理”(Object Request Broker,ORB)、“物件服務”(Object Services,也稱作CORBAservices)以及一些通用機制。
ORB是對象間相互請求的一條通訊匯流排。進行請求時,毋需關心對方的物理位置在哪裡。這意味著在客戶代碼中看起來象一次方案調用的過程實際是非常複雜的一次操作。首先,必須存在與伺服器對象的一條串連途徑。而且為了建立一個串連,ORB必須知道具體實現伺服器的代碼存放在哪裡。建好串連後,必須對方法自變數進行“彙集”。例如,將它們轉換到一個二進位流裡,以便通過網路傳送。必須傳遞的其他資訊包括伺服器的機器名稱、伺服器處理序以及對那個進程內的伺服器對象進行標識的資訊等等。最後,這些資訊通過一種低級線路協議傳遞,資訊在伺服器那一端解碼,最後正式執行調用。ORB將所有這些複雜的操作都從程式員眼前隱藏起來了,並使程式員的工作幾乎和與調用本機物件的方法一樣簡單。
並沒有硬性規定應如何?ORB核心,但為了在不同開發商的ORB之間實現一種基本的相容,OMG定義了一系列服務,它們可通過標準介面訪問。
1. CORBA介面定義語言(IDL)
CORBA是面向語言的透明而設計的:一個客戶對象可調用屬於不同類的伺服器對象方法,無論對方是用何種語言實現的。當然,客戶對象事先必須知道由伺服器對象揭示的方法名稱及簽名。這時便要用到IDL。CORBA IDL是一種與語言無關的設計方法,可用它指定資料類型、屬性、操作、介面以及更多的東西。IDL的文法類似於C++或Java文法。下面這張表格為大家總結了三種語言一些通用概念,並展示了它們的對應關係。
CORBA IDL Java C++
模組(Module) 包(Package) 命名空間(Namespace)
介面(Interface) 介面(Interface) 純抽象類別(Pure abstract class)
方法(Method) 方法(Method) 成員函數(Member function)
繼承概念也獲得了支援——就象C++那樣,同樣使用冒號運算子。針對需要由伺服器和客戶實現和使用的屬性、方法以及介面,程式員要寫出一個IDL描述。隨後,IDL會由一個由廠商提供的IDL/Java編譯器進行編譯,後者會讀取IDL源碼,並產生相應的Java代碼。
IDL編譯器是一個相當有用的工具:它不僅產生與IDL等價的Java源碼,也會產生用於彙集方法自變數的代碼,並可發出遠程調用。我們將這種代碼稱為“根幹”(Stub and Skeleton)代碼,它組織成多個Java源檔案,而且通常屬於同一個Java包的一部分。
2. 命名服務
命名服務屬於CORBA基本服務之一。CORBA對象是通過一個引用訪問的。儘管引用資訊用我們的眼睛來看沒什麼意義,但可為引用分配由程式員定義的字串名。這一操作叫作“引用的字串化”。一個叫作“命名服務”(Naming Service)的OMA組件專門用於執行“字串到對象”以及“對象到字串”轉換及映射。由於命名服務扮演了伺服器和客戶都能查詢和操作的一個電話本的角色,所以它作為一個獨立的進程運行。建立“對象到字串”映射的過程叫作“綁定一個對象”;刪除映射關係的過程叫作“取消綁定”;而讓對象引用傳遞一個字串的過程叫作“解析名稱”。
比如在啟動的時候,伺服器應用可建立一個伺服器對象,將對象同命名服務綁定起來,然後等候客戶發出請求。客戶首先獲得一個伺服器引用,解析出字串名,然後通過引用發出對伺服器的調用。
同樣地,“命名服務”規範也屬於CORBA的一部分,但實現它的應用程式是由ORB廠商(開發商)提供的。由於廠商不同,我們訪問命名服務的方式也可能有所區別。