由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廠商(開發商)提供的。由於廠商不同,我們訪問命名服務的方式也可能有所區別。