一、 引言
進入90年代以來,分布式組件對象標准極大地推動了以異構環境下協同工作為目標的虛擬環境研究。當今國際上已有三大分布式組件對象標准:一個是OMG組織推出的CORBA,即公共對象請求代理結構;一個是微軟公司推出的DCOM,即分布式組件對象模型;還有一個是SUN公司推出的用Java語言開發開發的分布對象模型RMI,即遠程方法激活。在三種分布式組件標准中,CORBA標准在結構標准實現的靈活性、跨語言能力、跨平台實現及安全性等方面的綜合對比中優於DCOM和RMI,所以它往往成為真正的開放式結構應用程序的首選標准。本文主要討論CORBA技術,並探討了在Delphi中的實現方法。
二、 CORBA及相關技術
1、 CORBA的概念和用途
CORBA是OMG(Object Management Group)提出的一個分布式對象技術的規范,它是針對多種對象系統在分布式計算環境中如何以對象方式集成而提出的,它為對象管理定義了一個對象模型-OMG參考模型(OMG reference model)及其框架結構。該模型由ORG、對象服務、公共設施、領域接口及應用對象等5個主要部分組成。該模型及其框架結構將面向對象技術與客戶/服務器計算模式結合起來,有效地解決了對象封裝和分布式計算環境中資源共享、代碼可重用、可移植及應用間地互操作性等問題。
2、 Com與Corba的比較
COM和CORBA都提供了一種創建分布式、面向對象的結構體系的方法,即它們都提供了從另一台機器中調用一個存在於二進制可執行文件中的對象方法。COM和CORBA都有許多用於支持它們的實用程序,例如MTS、ITS、調度程序、注冊表。然而,每個結構體系都有各自獨特的優點。
COM作為一項以Microsoft和Windows為基礎的技術,具有歸並到全世界90%的台式計算機的優勢,它不受約束並且擁有廣泛的廠家支持。
CORBA可能是目前可真正提供全方位支持的較好系統。如,它在處理故障及加載分布方面比COM有更好的支持。當然,CORBA還是比COM更好地支持廣泛的操作系統。
3、 Org
ORG(Object Request Broker)常被稱作一組服務的類名稱,這組服務用於連接客戶和服務器,並在客戶和服務器之間來回傳遞方法調用和信息。
因為ORG是在DLL裡實現的,所以,它們駐留在服務器和客戶實現的處理中,它們必須安裝在所有使用CORBA的客戶及服務器上。
4、 Smart Agent?
Smart Agent是一項用來幫助客戶自動對一個服務器進行定位的目錄服務。其宗旨在於幫助客戶機連接到服務器上,並執行其他一些類似負載均衡和重啟崩潰對象這樣的重要任務。即:Smart Agent具有目錄服務,它能查出對象的位置,並把客戶程序接到這些對象上。
5、 代理、存根和框架
在一個分布式的應用程序裡,客戶不能直接與服務器通信,同樣一個服務器也不直接與客戶交流。函數的調用及其參數都必須通過網絡從一個應用程序中調度到另一個應用程序裡。為了使該體系工作,客戶和服務器兩邊都要建立一個代理。客戶這邊的代理稱為存根(Stub),而服務器的代理則叫框架(Skeleton)。
存根實現方法如下:
function TcorbaTestObjectStub.GetName:WideString;
var
OutBuf:ImarshalOutBuffer;
InBuf:ImarshalInBuffer;
Begin
Fstub.createRequest('GetName',True,OutBuf);
Fstub.Invoke(OutBuf,InBuf);
Result:=UnmarshalWideText(InBuf);
End;
其中,Fstub數據成員來自於CorbaObj單元,在CorbaObj單元裡它被聲明為Istub類型。Fstub.createRequest方法用一個ImarshalOutBuffer類型的變量與想調用的函數的名字進行連接,這個變量可通過Internet傳輸。當該包建好後,就可以調用Invoke將信息傳遞到服務器並從同一個服務器中得到反饋信息。ImarshalInBuffer類型的InBuf變量包含了該反饋信息,可以調用UnmershalWideText。
框架的目的在於接收由存根對Invoke的調用而傳來的消息。當它收到消息後,就調用真正的GetName方法,接著把結果包裝起來迅速傳給客戶,實現方法如下:
Procedure
TcorbaTestSkeleton.GetName(constInBuf:ImarshalInBuffer;CookIE:Pointer);
Var
OutBuf: ImarshalOutBuffer;
Retval: WideString;
Begin
Retval:=Fintf.GetName;
Fskeleton.GetReplyBuffer(CookIE,OutBuf);
OutBuf.PutWideText(PwideChar(Pointer(Retval)));
End;
該程序分兩步:
第一步:是從由Delphi自動設置的內部Fintf變量調用Get Name。Fintf僅僅是一個指向對象真實接口的指針。因為現在正處於服務器本身當中,因此,這是指向你所創建的實際對象的真實指針。
第二步:是將函數結果包裝起並把它送回客戶端,你將通過調用GetReplyBuffer和PutWideText完成該步驟。
6、 接口定義語言
接口定義語言(IDL)用於定義對象的接口,一個對象的接口指定該對象所支持的類型和操作,因而唯一定義了可用於該對象的請求形式。所有接口均隱式從CORBA模塊中定義的Object接口中導出。
接口定義語言(IDL)的重要特征是其語言無關性,這使得對象可用不同的程序設計語言構造,且依然可相互通信,CORBA規范通過精確定義基本數據類型的長度,保證了在異構硬件平台上的互操作性。
三、 Delphi4中CORBA客戶和服務器對象分布式工作機理
Delphi4工具支持CORBA標准,並為開發分布式應用程序提供了優良的環境。
圖中客戶和服務器兩邊都有一個代理。在Delphi4中,真實的存根與框架由Delphi4在創建CORBA對象時自動生成,並存放於CORBA對象_TLB.pas命名的文件中。存根與框架這對代理使客戶感覺到好象真的與服務器直接通信,而它們的具體實現存在於服務器中。在Delphi4中ORB就是一組動態連接庫,它們提供了網絡傳輸層以下的通信機制。圖中的OsAgent不是CORBA標准中的一部分,它的宗旨在於幫助客戶機連接到服務器上去,並執行其它一些類似於負載均衡和重啟崩潰等重要任務。當客戶程序啟動時,它使用ORB與OsAgent進行通信,使客戶機自動連接到服務器上去,換句話說,OsAgent有目錄服務功能,它能夠自動找出對象的位置。應該指出的是,在實現分布式應用程度過程中,客戶、服務器雙方必須都安裝有OsAgent程序,同時必須在通信之前啟動了OsAgent服務。
四、 Delphi中兩個重要的CORBA存儲庫
1、 Interface Reposity
Interface Reposity是一個用來存儲有關對象的具體內容的地方。該資源庫有三種用途:
1)、它為用戶提供了一個場所,用戶可以通過它來查看有關對象的詳細信息。
2)、它提供了允許CORBA對方法調用進行類型檢查的機制。
3)、它允許在運行期間對一個對象進行動態調用。
2、 Implementation Reposity
Implementation Reposity用來存儲有關服務器的信息,這樣服務器才能自動被Smart Agent啟動,尤其是Implementation Reposity含有有關服務器的名字及用來找到它的可執行程序的路徑信息。
當一項叫做OAD(即Object Activation Daemon)的CORBA服務器需要啟動一個服務器時,OAD可以通過查看Implementation Reposity,並執行其中的文件來給服務器定位。換句話說,Implementation Reposity中存儲著服務器的路徑、可執行文件名及其他一些相關的信息,如果該服務器並未運行但卻已在Implementation Reposity中注冊過了,那麼Smart Agent可以請求OAD來啟動它。
五、 在Delphi中使用CORBA
為在Delphi中使用Corba技術,首先要創建服務器和客戶,然後在此基礎上創建各類實用程序。服務器和客戶程序創建如下:
1、 服務器的創建
創建CORBA服務器所需的步驟如下:
1)、創建一個標准的應用程序並保存到自己的目錄中。在該目錄下建立兩個附加子目錄,一個叫ClIEnt,另一個叫Server。
2)、選擇New File,轉到multitIEr頁面,選擇CORBA Object。當提示為對象取個名字的時候,應叫它CorbaTestObject,而讓其他所有設置都處在默認的狀態。
3)、打開Type Library Edit建立一個叫GetName的方法,它是IcorbaTestObject的一部分,小心別把它加到根上(Project Name).在此處編輯器是不允許一個方法加入的。
4)、該方法的返回類型應該是一個WideString。在Parameters頁面的靠近頂端處設置它,這個方法的COM IDL是:HRESULT_Stdcall GetName([out,retval])BSTR *Name).而Delphi的聲明是:Function GetName:WideString[dispid$00000001];safecall;這個方法自動說明為Safecall,但這在Type Library Editor中可能不太明顯。
5)、單擊Refresh按鈕來產生方法的代碼。完成這個方法的實現代碼,讓它返回一個對象名字的字符串。
6)、存盤,執行一次該程序。到這一階段,該應用程序必須提前運行,否則客戶就無法訪問它。
2、 客戶程序的創建
建立一個客戶應用程序的步驟:
1)、啟動一個正規的應用程序
2)、將由服務器創建的XXX_TLB.pas文件加到主窗體的uses子句中,然後再把CornInit也加到uses子句中。
3)、創建一個按鈕響應方法。
4)、從XXX_TLB.pas文件中獲得CreateInstance的調用,並將它復制到按鈕響應方法中,去掉無關的存儲單元,保存其返回的類型。
5)、聲明一個叫FcorbaTest的局部變量,它是屬於對象返回的類型,在此處便是ICorbaTestObject,將從TLB中復制來的函數的返回值賦給它,將你所選擇的任何字符串輸送給CreateInstance.
FcorbaTest:=TcorbaTestObjectCorbaFactory.CreateInstance('CorbaTest');
6)、寫一段代碼從對象實例中調用方法,該對象實例是從TLB中復制的函數中返回的。
7)、確定Smart Agent已啟動,然後啟動服務器與客戶應用程序,接著調用服務器所定義的方法(注:除非正在使用OAD,否則要明確啟動服務器與客戶應用程序,因為它是不會自動啟動的)。
四、結束語
CORBA通過ORG機制為遠程對象的激活提供了基本機制,而不管實現這些對象所使用的平台和技術,而且CORBA還為對象管理提供了一組對象服務,如名字服務、事件服務、事物處理服務及永久對象服務等。因此該技術為分布式應用的開發提供了強有力的支持,具有廣泛的應用基礎。