ICE運行時環境備忘一

1、ICE運行環境的唯一句柄Communicator對象,其用來管理ICE運行環境下所有對象資源,包含但不限於:
   A、客戶端線程池,主要用來進行AMI方法的回調接口調用,防止環形調用產生的死鎖
   B、服務器端的線程池,主要用來接收和處理客戶端的接口調用請求
   C、ICE運行環境對應的屬性集合
   D、對象工廠,主要用來根據實例化接口對象
   E、日誌對象和統計對象,其實現日誌接口和統計接口用以實現ICE運行過程中的日誌記錄和網絡傳輸統計
   F、缺省的路由器和定位器
   G、插件管理對象,用來管理ICE運行環境下的插件對象
   H、對象適配器ObjectAdapter,用以維護對象標示和服務對象之間的映射關係
2、Communicator對象的定義類似如下:
class CommunicatorI : public Communicator
{
public:
virtual void destroy();                   // 銷燬通信器以及其所管理的ICE運行資源
virtual void shutdown();                  // 關閉通信器,不再接收客戶端請求,但是正在執行的請求會執行完成
virtual void waitForShutdown();           // 等待當前通信器結束,意味着正在執行的所有請求都執行完畢
virtual bool isShutdown() const;          // 判斷通信器是否已經關閉


virtual ObjectPrx stringToProxy(const std::string&) const;    // 根據對象標示獲取對象的代理
virtual std::string proxyToString(const ObjectPrx&) const;    // 根據對象代理獲取對象的標示


virtual ObjectPrx propertyToProxy(const std::string&) const;  // 根據給定的屬性名稱找到對應值的代理對象
virtual PropertyDict proxyToProperty(const ObjectPrx&, const std::string&) const;  // 返回代理對象的屬性集


virtual Identity stringToIdentity(const std::string&) const;  // 將字符串標示轉換成唯一ID
virtual std::string identityToString(const Identity&) const;  // 將唯一ID轉換成字符串


virtual ObjectAdapterPtr createObjectAdapter(const std::string&);  // 通過名字創建對象適配器,端口在配置文件中配置(name.Endpoints)
virtual ObjectAdapterPtr createObjectAdapterWithEndpoints(const std::string&, const std::string&); //通過名稱和端口創建適配器
virtual ObjectAdapterPtr createObjectAdapterWithRouter(const std::string&, const RouterPrx&);  // 通過名字和路由器來創建適配器


virtual PropertiesPtr getProperties() const;    // 獲取通信器的屬性集合
virtual LoggerPtr getLogger() const;            // 獲取日誌接口對象
virtual StatsPtr getStats() const;              // 獲取統計接口對象
};
3、通信器Communicator的創建和初始化方法:
    Ice::CommunicatorPtr ic = Ice::Initialize(argc, argv, initdata);       // 通過命令行參數創建,會解析命令行中ICE相關屬性
Ice::CommunicatorPtr ic = Ice::Initialize(initdata);                   // 通過初始化對象創建

Ice::InitializationData initdata;                                      // 構建初始化對象
initdata.properties = Ice::createProperties(args);                     // 設置初始化對象的屬性集合
initdata.logger = new MyLoggerI;                                       // 設置對應的日誌接口
initdata.stats = new MyStatsI;                                         // 設置對應的統計接口
4、對象適配器是ICE運行環境用來維護ASM的對象,管理ICE運行環境Activate Servant Map
   每個對象適配器有一個和多個接入端點可以接入
   每個對象適配器默認採用communicator的服務器線程進行消息處理,當然也可以通過指定<adapter-name>.ThreadPool.Size來指定自己的線程池
   可以通過Communicator中如下的方法創建一個ObjectAdapter對象:
   createObjectAdapter、createObjectAdapterWithEndpoints、createObjectAdapterWithRouter   
   Adapter對象提供了getName方法獲取對象名稱、getCommunicator方法獲取其所在的通信器對象
   對象適配器是一個有狀態的對象,其包含狀態包括:Holding(初始狀態,不接收請求)、Active(激活狀態,正常處理)、Inactive(去激活狀態,對象即將銷燬)
   對象適配器提供了一系列的API來管理其狀態轉換:activate、hold、deactivate、waitForHold、waitForDeactivate、destory   
   對象適配器均有一個地址與其對應,類似如:"tcp -h 10.0.0.1 -p 35840 -t 5000 -z:tcp -h 10.0.0.2 -p 35840 -t 5000 -z" (綁定兩個地址,超時5s,支持壓縮)
   可以調用objectadapter的getEndpoints返回所綁定的地址信息
5、Servant對象時真正的接口服務對象,要想提供服務,需要將Servant對象加入到某一個objectAdapter中,並指定一個對象標示
    virtual ObjectPrx add(const ObjectPtr&, const Identity&);      // 指定ID添加對象,一般調用該方法
    virtual ObjectPrx addWithUUID(const ObjectPtr&);               // 自動生成對象標示來添加對象,僅僅臨時的服務對象調用該方法添加
virtual ObjectPtr remove(const Identity&);                     // 從objectadapter的ASM中移除一個服務對象

    virtual ObjectPrx createProxy(const Identity&) const;          // 創建servant對應的代理對象
    virtual ObjectPrx createDirectProxy(const Identity&) const;    // 創建servant的直接代理對象
    virtual ObjectPrx createIndirectProxy(const Identity&) const;  // 創建servant的間接代理對象
6、在生成的ICE接口方法代碼中,每個映射方法的後面都攜帶了一個current參數,Current的定義如下:
   module Ice 
   {
        local dictionary<string, string> Context;
        enum OperationMode { Normal, \Idempotent };
        local struct Current 
   {
            ObjectAdapter adapter;    // 服務器的對象適配器,可以通過它再調用getCommunicator得到通信器
Connection con;           // 連接對象
            Identity id;              // 服務對象標示
            string facet;             // 
            string operation;         // 操作的名稱
            OperationMode mode;       // 操作模式
            Context ctx;              // 操作上下文屬性
int requestId;            // 請求ID
        };
    };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章