體驗CORBA組件模型CCM:1、引言

體驗CORBA組件模型CCM1、引言

摘要:

在比較CORBA2.xCORBA3.x的基礎上,簡要介紹CCM引入的新特性。

一、概述

雖然CORBA2.x已成功應用於諸多軟件系統的開發,但CORBA2.x僅是一個分佈式對象計算模型,並不是一個組件對象模型,OMG組織考慮到CORBA2.x存在的以下問題:

·        缺乏功能分界

CORBA2.x對象模型中,所有的接口均被視爲是面向客戶程序的,而缺乏在不同接口實現間進行通信的通用規範。

·        難於擴展對象的功能

CORBA2.x中,對象只能通過繼承(而不是組合)來擴展,應用程序開發人員必須先定義一個IDL接口、實現該接口、並在所有Server中配置該實現。但CORBA IDL的多重繼承是有缺陷的,因爲有的語言不支持重載;另外,應用程序可能用同一個IDL接口多次發佈服務的多個實現或多個實例,但多重繼承使得不可能不止一次的發佈同一接口,或由客戶確定哪一個是最下層的版本。

·        缺乏統一的軟件配置、部署規範等

缺乏統一的軟件配置、部署規範使得開發人員需要用各自不同的方式,來進行應用系統的初始化及配置、管理,使得整個軟件系統變得難於管理與維護。

 

同時,考慮到組件化中間件的必然趨勢,OMG1999年正式發佈了CORBA3.0CORBA3.0除將IDL2.x擴展到IDL3.0外,還將CORBA組件模型(CCM)引入到了CORBA的世界,使得CORBA成爲一種組件中間件技術。

(注:CORBA2.x規範所定義的CORBA僅爲一種分佈式對象計算技術,有些文章中以CORBA2.x實現爲基礎討論CORBA組件技術,並將其與EJBCOM等進行比較,是完全錯誤的。)

組件中間件技術通過更高層次的抽象定義,彌補了面向對象中間件技術的一些缺陷,定義了組件的虛擬邊界、定義了組件的發佈方法,以及組件與其他組件和客戶端進行交互的方式。同時,組件中間件的定義也支持運行時環境、封裝和發佈的機制和標準,所有的這些機制和標準都使得了軟件組件的重用變得更加簡單。通過使用組件中間件,系統可以使用一種“裝配的”方式來搭建,而不是使用傳統的工程方法,即CORBA2.x中,沒有標準支持二進制級別的重用,所有的重用基本是源碼級別的,而在CCM中,我們可以以組件爲單位在二進制級別上進行實現重用,雖然這在目前來講還比較困難。

OMGCCM規範是以EJB爲藍本提出的,並且,爲了兼容EJBCCM還對與EJB的互操作進行了討論,但目前CCM的商業應用遠不如EJB廣泛,這一方面與CCM本身的複雜性有關,同時也與CORBA中間件提供商及客戶的關注程度有很大關係。

 

CIAOComponent Intergrated ACE-ORB)是一個基於ACE/TAO的開源CCM實現,它主要面向分佈式實時嵌入式(Distributed Real-time EmbededDRE)應用,是目前所有的CCM實現中相對比較成熟的一個(注:可從http://deuce.doc.wustl.edu/Download.html下載到CIAO的最新版本源代碼)。本文將以CIAO0.5爲平臺,實例講解如何在CIAO0.5中運用CCM提供的新特性進行CORBA組件的設計。

二、CCM新特性

CCM鼓勵通過組合而不是繼承來重用組件,爲使用組合,組件需要將它的部分操作委派給其它組件。爲此CCM規範定義了兩種級別的組件類型:基本(basic)組件類型、擴展(extend)組件類型。基本類型組件,主要用於對傳統的CORBA分佈對象進行組件化實現;擴展組件支持新的接口外觀特徵,這些新的接口外觀特徵被稱作端口(port),用於支持客戶與組件以及組件間的互連,而基本組件類型不支持新的接口外觀特性。

CCM支持五種基本端口:刻面/插座(facet/receptacle)、事件源/事件槽(event sources/sink)和屬性(attribute)。五種Port的表示方法如下圖所示:

  • 刻面facet):組件實現且可供組件客戶使用的接口;
  • 接插口receptacle):組件使用外部對象(或組件)引用的連接點(一般用於分佈組件之間的互連或組裝);
  • 事件源event source):命名了的組件事件源(事件發送)連接點,用於向一個或多個關注特定事件類型的事件消費者或事件通道發送該類型的事件;
  • 事件槽event sink):命名了的組件事件槽(事件接收)連接點,用於接收外界向其推入的特定類型事件。
  • 組件屬性attribute):是組件向外界顯露的可被訪問(accessor)或可被定製的內容(mutator),主要用於定製組件。

 

此外組件還支持其它一些新特性,包括:

  • 組件標準Home接口:提供組件工廠(創建)模型或查找模型的方法接口;
  • 主特徵鍵值primary keys):使得客戶可以(根據特徵鍵值)查找或確認特定的組件實例。

2.1 組件的多重刻面(接口)和刻面導航接口

組件可以提供多重對象引用,稱之爲刻面,用於向客戶提供該組件的不同內容的CORBA接口。組件還可以生成一個稱之爲組件等價接口的單一的對象引用,用於導航至其它組件刻面。

組件內部封裝了不同組件刻面的實現,對客戶不透明。客戶可以通過組件的任何刻面或組件的等價接口導航至組件的其它刻面接口。

 

在聲明組件時,可通過provides關鍵字來指定組件對外提供的Facet,如:

provides Interface_Name facet_name;

對於每個Facet,都有一個獨立的實現類與之對應,該實現類的名稱爲:

class Interface_Name_exec_i;

通過編譯IDL文件,自動化工具會爲組件的最終實現類生成一個名爲:

get_facet_name

的方法,以便在容器向組件請求Facet服務時返回對應接口實現的實例。

2.2 組件接插口

組件接插口提供了組件間互相連接的模型描述,用於描述組件與其它被連接對象(組件)接口之間的關係。組件接插口可以比較簡單(如只管理單一的對象/組件引用),也可以較爲複雜(管理多重連接的對象/組件引用)。

 

Receptacle可通過uses關鍵字來指定,如:

uses Interface_Name receptacle_name;

通過編譯IDL文件,自動化工具會在爲組件對應的Context類中添加一個名爲:

get_connection_receptacle_name

的方法,以便通過容器向另一組件請求對應的Facet接口,以調用Facet提供的方法,完成相應的邏輯處理。

一個Facet可對應多個Receptacle,而一個Receptacle只能有一個對應的Facet

2.3 組件事件

CCM支持發佈/徵訂(publish/subscribe)式的事件模式。並使用推技術,提供簡單的API,支持對CORBA通知(Notification)服務的使用。

組件事件源:

組件事件可以以發射方式(emitter)或發佈方式(publisher)向外界發送事件,其中發佈方式的組件事件源允許組件發佈到事件通道上的事件可以被多個事件徵訂者所獲取。事件客戶可通過事件發佈器直接訪問組件產生的事件流;發射方式的組件事件源則只允許組件發佈到事件通道上的事件被單個指定的事件徵訂者所獲取(而其它的徵訂者則不能獲取)。發射方式的組件事件源主要用於組件的配置,一般在初始化或配置時刻被連接到系統的相關單元上,並且不暴露給一般用戶。

 

在聲明組件時,可通過publishesemits來指定Event Source,如:

publishes EventType_Name event_name;

EventType本身是一個值類型,應該以eventtype關鍵字來聲明,如:

eventtype EventType_Name {

      public event_attr attr_name;

};

通過編譯IDL文件,自動化工具會爲組件對應的Context類添加一個名爲:

push_event_name

的方法,以便通過容器向其它組件發佈通知事件。

組件事件槽:

事件槽定義了組件隱含接收事件的事件類型。外部實體可以連接事件槽提供的事件消費者接口,與其進行關聯。與事件源不同,事件槽並不區分特定或一般的事件發送者。通過定義事件槽,組件可以聲明其感興趣的事件類型。

 

Event Sink可以用consumes關鍵字來指定,如:

consumes EventType_Name event_name;

通過編譯IDL文件,自動化工具會爲組件的最終實現類生成一個名爲:

push_event_name

的方法,以便在容器向組件轉發通知事件時對該事件進行處理。

2.4 主特徵鍵值

組件可以向外界顯露一個主特徵鍵值。客戶可以通過該值查找、創建、刪除相關的組件實例。

2.5 Home接口

組件Home是管理組件實例的元類型。組件Home接口提供了管理組件生命週期的接口,以及根據主特徵鍵值關聯相關組件實例的功能接口,從概念上理解,組件Home是其相關組件類型實例的管理器。

當組件被裝配到組件容器中後,Home對象即被創建。組件的主特徵鍵值通過Home創建並設置,與組件實例進行關聯。在CCM規範中,主特徵鍵值可顯露給組件客戶使用,輔助其確認與相關的組件實例連接。儘管不同的Home類型可以管理同一種組件類型,但在運行時刻,一個組件實例只能被一個Home對象所管理。

Home提供工廠模式的創建操作或查找模式的查詢操作來管理組件實例。另外,除了隱式定義的工廠創建或查找操作外,組件開發人員還可以通過擴展的IDL定義其它任意格式的組件創建(factory)或查找(finder)操作,如:

factory create_func_name(arg_list);

finder find_func_name(arglist);

通過編譯IDL文件,自動化工具會爲對應的組件類生成一個返回值爲組件類指針類型的工廠方法和查找方法,而方法的名稱是你在IDL文件中定義的名稱。

開發人員甚至可以在Home接口中定義其它操作供用戶使用,如查詢內部接口含義等自省機制的操作。

2.6 組件屬性和配置

CORBA組件模型支持組件的屬性和配置特徵,使得設計者可以在配置組件的過程中通過屬性來區分組件接口,或在運行組件的過程中通過屬性定義來配置不同的組件實例,以與其它組件實例相區分。

 

在聲明組件時,可以在attribute前添加readonly關鍵字以表明屬性是隻讀的,如:

readonly attribute Attribute_Type attr_name;

通過編譯IDL文件,自動化工具會爲組件的最終實現類生成相應的accessor方法和mutator方法,以用於讀取和修改屬性的值(對於readonly屬性,僅有accessor方法),這些方法除可供配置時使用外,在組件實現內部也可使用。

 

組件的配置過程主要是設置組件屬性的過程,在CCM規範中把組件的配置生命週期(Configuration Life Cycle)分爲配置階段(Configuration Phase)和操作階段(Operational Phase),在配置階段組件不響應客戶端任何請求,由代理調用一些特殊的操作來配置或修改組件的屬性集;當配置完畢之後,調用configuration_complete操作標誌配置階段結束,組件進入可操作階段。

CCM定義了配置(configurator)對象,用於封裝組件的屬性配置功能,它通過調用一組組件支持的屬性定製方法對組件屬性進行配置。

2.7 組件的繼承

組件類型通過繼承通用CCM Object接口,以提供CORBA規範定義的組件特徵,如接口導航、組件接插口、事件接口等等,而組件Home則繼承了CCM Home接口。

三、組件實現

CCM規範定義了一種描述語言,組件實現定義語言(Component Implementation Definition Language CIDL),用於定義組件及組件Home和相關抽象狀態的實現。CIDL編譯器使用CIDL描述生成組件的實現骨架,其中自動集成了大部分基本的組件功能,如接口導航、組件確認、組件查詢、組件激活、狀態管理、生命期管理等等。組件的實現者通過擴展這些實現骨架(放入業務邏輯),實現最終的組件。

CIDL是持久狀態定義語言(Persistent State Definition Language PSDL)的超集,它允許描述組件內部狀態與外部抽象存儲類型的聯繫,組件實現框架CIF和組件容器則可以通過協作自動對組件的持久狀態進行管理。

一個組件類型是一組基於IDL組件定義以及其它相關結構描述信息的集合,它具有特定的狀態和特徵值,並封裝了內部的表示和實現。

組件實現以組件包的形式存在,它包含了一種或多種組件實現的可執行代碼,以及描述該組件類型的元數據。組件包有兩種隱含的使用方式,即在組件應用開發時,由應用組裝工具對其進行定製和安裝;或在運行時,直接通過配置工具將其裝載入當前可運行的組件容器中,被組件應用的客戶所使用。

組件在CORBA組件容器中被初始化和“存活”,不同的組件類別將使用到不同類別的組件容器。

 

組件的開發步驟可大致分爲以下幾步:

1.      組件應用的分析/設計

2.      組件定義(基於IDL/CIDL語言)

即定義接口和異常及需要用到的基本數據結構,並利用IDL3.x新增的CCM關鍵字(如componentsupportsprovidesusespublishesemitsconsumes)來“組裝”組件,並定義組件的home接口以聲明用於創建組件的factory方法;

3.      組件實現(用戶實現業務邏輯功能)

4.      組件打包:

組件打包文件包括組件實現和組件描述。一個完整的組件是可配置的,具有自描述能力的軟件包(package)。組件包可以在運行時被安裝或配置到組件應用中立刻爲客戶提供服務,也可以在設計時通過開發環境“可視的”進行裝配,並生成裝配信息。被打包的組件實現和組件描述等內容將以組件存檔文件的形式進行存儲。

5.      組件組裝:

組件組裝階段可以對多個組件進行定製,連接(與其它組件)和分割,並形成組件組裝存檔文件。組件組裝文檔描述了一組(可以是已定製了的)物理組件集合及其之間的關係描述,包括定義組件實例之間的關係,配置組件的初始屬性/狀態,描述與其它組件的連接關係等內容。組件組裝文檔既可以直接進行配置,在運行時可被一個組件容器或位於不同主機的多個組件容器所動態裝入和初始化,也可以繼續被構造成更復雜的組裝文檔。

6.      組件的配置與安裝:

提供配置/安裝服務,可以將打包好的組件配置安裝到網絡上的特定主機上運行。

7.      組件實例激活與運行:

一旦組件被配置和安裝成功,組件實例通過標準的CORBA ORB機制被激活運行並提供相應的服務。

 

下一篇文章將以一個實例,詳細討論基於CIAOCCM組件的開發過程。

參考:

1.      Sharplog. CCM簡介. http://corbatime.diy.myrice.com/article/ccm_intro.htm

2.      OMG CCM Implementers Group and MARS PTF & Telecom DTF, CORBA Component Model Tutorial, http://www.omg.org/docs/ccm/02-04-01.ppt, April, 2002.

3.      Object Management Group, Inc. CORBA Component Model Specification, v4.0, http://www.omg.org/cgi-bin/apps/doc?formal/06-04-01.pdf, Apr, 2006

4.      Douglas C. Schmidt and Steve Vinoski, Object Interconnections: The CORBA Component Model: Part 1, Evolving Towards Component Middleware, C/C++ Users Journal, February, 2004.

5.      Douglas C. Schmidt and Steve Vinoski, Object Interconnections: The CORBA Component Model: Part 2, Defining Components with the IDL 3.x Types, C/C++ Users Journal, April, 2004.

6.      Bala Natarajan, Douglas C. Schmidt, and Steve Vinoski, The CORBA Component Model Part 3: The CCM Container Architecture and Component Implementation Framework, C/C++ Users Journal, September, 2004.

7.      Bala Natarajan, Douglas C. Schmidt, and Steve Vinoski, The CORBA Component Model Part 4: The CORBA Component Model Part 4: Implementing Components with CCM, C/C++ Users Journal, October, 2004.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章