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,否則這樣的嵌套調用會導致線程的死鎖等待
默認的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,否則這樣的嵌套調用會導致線程的死鎖等待
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.