ICE的連接機制

1、當使用ICE的proxy進行方法調用時,ICE運行環境會建立一個到服務器的連接。當proxy提供了多個endpoint時
   默認的ICE運行環境選擇endpoint的行爲爲random,可以通過ice_endpointSelection設置選擇endpoint的方式爲order
   也可以通過設置屬性:Ice.Default.EndpointSelection、name.EndpointSelection來改變endpoint的選擇策略
2、ICE的連接在失敗時會重試,重試的規則取決於屬性Ice.RetryIntervals,默認取值爲0,即立即重試一次
   可以配置成如下形式:Ice.RetryIntervals=0 10 50 100
   可以配置Ice.Trace.Retry來跟蹤連接的重試
3、ICE支持給每個連接一個唯一的ID標示,來讓應用控制連接的使用行爲,通過調用proxy的ice_connectionId方法
   來給其建立的連接命名。當然使用相同連接ID的代理意味着共享了相同的連接
4、ICE會對proxy上的建立的連接進行cache,以確保下次方法調用時儘可能的使用已經建立的連接,有時如果應用針對
   某個proxy有多個endpoint,並且希望在這些endpoint之間保持負載均衡的方法調用,那麼可以通過設置屬性
   ice_connectionCached(false)來關閉連接cache,當然這也會爲頻繁的連接建立帶來足夠的開銷
5、ICE的每個連接都有兩個超時時間:ice_timeout、ice_connectiontimeout,分別對應消息的超時時間和連接建立
   的超時時間,可以通過在代理上調用上述方法來設置超時,也可以通過屬性Ice.Override.Timeout、Ice.Override.ConnectTimeout
   來強制改變超時時間
6、ICE運行環境針對每個communicator可以設置連接ACM,分別爲Ice.ACM.Client和Ice.ACM.Server,默認取值爲60s
   意味着如果連接存在60s的idle時間,那麼連接將會自動關閉。可以設置取值爲0來禁用IDLE檢測機制。那麼連接建立後
   則不會關閉,直到communicator關閉爲止。ICE檢測空閒連接的時間間隔爲Ice.MonitorConnections,取值在5s到5m之間。
   如果你使用了glacier2來進行防火牆的策略調度,那麼你最好關閉ACM,否則可能會導致過早的關閉客戶端連接而導致
   回調無法成功
7、程序中獲取連接:客戶端可以使用proxy->ice_getConnection(),服務器端可以使用current.conn
8、連接對象提供的接口方法如下:
   local interface Connection 
   {
       void close(bool force);                    // 關閉連接,基本上很少顯示調用
       Object* createProxy(Identity id);          // 在使用雙向的防火牆策略時,常在客戶端使用來創建回調對象
       void setAdapter(ObjectAdapter adapter);    // 設置代理的對象適配器,也常用於雙向連接
       ObjectAdapter getAdapter();                // 獲取adapter對象
       Endpoint getEndpoint();                    // 獲取endpoint端點信息
       void flushBatchRequests();                 // 刷新批量請求
       string type();                             // 返回協議類型,類似如:tcp、udp、ssl
       int timeout();                             // 返回超時時間
       string toString();                         // 串化
       ConnectionInfo getInfo();                  // 獲取連接的相關連接信息,類似如tcp端口、udp信息等
    };
注意getEndpoint和getInfo返回的是基類信息,需要根據type方法的返回值來進行向下轉型獲取詳情
9、 客戶端雙向連接的使用:
Ice::ObjectAdapterPtr adapter = communicator->createObjectAdapter("");  // 創建默認adapter,無名稱,無端點
    Ice::Identity ident;
    ident.name = IceUtil::generateUUID();
    ident.category = "";
    CallbackPtr cb = new CallbackI;                                         // 創建回調對象
    adapter->add(cb, ident);                                                // 添加回調對象爲servant
    adapter->activate();                                                    // 激活adapter
    proxy->ice_getConnection()->setAdapter(adapter);                        // 設置代理對象的連接adapter爲當前adapter
    proxy->addClient(ident);                                                // 傳遞callback的ID給服務器
10、服務器端雙向連接的使用:
    CallbackPrx client = CallbackPrx::uncheckedCast(curr.con->createProxy(ident)); // 在連接上使用callback的id來創建代理
    client->notify();                                                              // 回調代理
注意,該處創建的callbackprx代理不能修改其相關屬性:類似timeout、twoway、datagram等,同時需要關閉ACM機制來防止
不合事宜的連接關閉
11、客戶端的雙向調用接收callback的回調是在客戶端線程池中,但是此時可能客戶端線程池正在阻塞在客戶端請求上,那麼
    你最好配置客戶端線程池的線程個數大於1,否則這樣的嵌套調用會導致線程的死鎖等待 

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