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的连接机制的更多相关文章
- ZeroC Ice启用SSL通讯的配置
Zeroc ICE ( Internet Communications Engine )中间件号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火墙穿透,通讯 ...
- 第3月第2天 find symbolicatecrash 生产者-消费者 ice 引用计数
1.linux find export find /Applications/Xcode.app/ -name symbolicatecrash -type f export DEVELOPER_DI ...
- c#Ice开发之环境配置(一)
第一步,基于Windows下的安装,所以下载windows版的Ice,官网最新版本是Ice3.5.1: http://www.zeroc.com/download/ 安装完成可以在vs-工具的最下面看 ...
- Ice分布式程序设计—IceBox(Hello World Application)
忙了三天,总算浏览完此书.藉此记下 Ice 的 IceBox 服务框架. 在此用 IceBox 框架写 Hello World 程序,即以载体来体现其特性. 第一步:编写 Slice 文件,映射生成 ...
- ZeroC Ice 暂记
摘自: http://weibo.com/p/1001603869896789339575 原文地址: http://www.oschina.net/question/865233_242146 吴治 ...
- webrtc进阶-信令篇-之三:信令、stun、turn、ice
webRTC支持点对点通讯,但是webRTC仍然需要服务端: . 协调通讯过程中客户端之间需要交换元数据, 如一个客户端找到另一个客户端以及通知另一个客户端开始通讯. . 需要处理NAT(网 ...
- VS2012配置使用ICE通信接口
1.下载安装Ice-3.5.1.msi http://www.zeroc.com/download.html 2.添加安装路径到环境变量path,D:\Program Files (x86)\Zero ...
- clang 搭建和编译boost 和zero ICE库 (Ubuntu10 64)
相关介绍资料如下: Boost编译http://sourceforge.net/projects/boost/files/boost/1.55.0/boost_1_55_0.tar.gz/downlo ...
- Ice的HelloWorld(Java)
Ice是一种面向对象的中间间平台,入门ice,简单的HelloWorld是必不可少的. 转载请注明http://www.cnblogs.com/zrtqsk/p/3745286.html,谢谢. 一. ...
随机推荐
- 剑指offer 面试35题
面试35题: 题目:复杂链表的复制 题:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中 ...
- 模版抽离 优化url
抽离出base模板 复制index的代码到base里面,指定views里面跳转到base.html,删除掉会变化的保留通用的 把主要内容写写在block里面,写了三个block {% block le ...
- Django 进阶篇之 Form验证
Django Form验证 在实际的生产环境中比如登录和验证的时候,我们一般都使用Jquery+ajax来判断用户的输入是否为空,假如JS被禁用的话,咱们这个认证屏障是不是就消失了呢?(虽然一般不会禁 ...
- PHP实现生成唯一编号(36进制的不重复编号)
当我们要将一个庞大的数据进行编号时,而编号有位数限制,比如5位的车牌号.10位的某证件号码.订单流水号.短网址等等,我们可以使用36进制计算出符合位数的不重复的编号. 我们将0-Z(012345678 ...
- PAT 天梯赛 L1-037. A除以B 【水】
题目链接 https://www.patest.cn/contests/gplt/L1-037 AC代码 #include <iostream> #include <cstdio&g ...
- Linux文件系统管理 常见命令df、du、fsck、dumpe2fs
概述 Linux文件系统管理 常见命令df.du.fsck.dumpe2fs. 文件系统查看命令:df 通过 df 命令可以査看已经挂载的文件系统的信息包括设备文件名.文件系统总大小.已经使用的大小. ...
- ETL应用:一种处理接口的Pro*C实现方法
2007年,当时项目所有ETL采用C编写,实现了ETL基本功能.当接口很多时,为保证文件获取效率,做好接口可配置:文件维护中经常会出现接口晚到情况,需要有一种方法能将接口晚到信息写入数据库,便于短信告 ...
- windows简单使用etcd
一.下载安装选择版本 https://github.com/coreos/etcd/releases 二.解压 三.首先开启etcd 1.进入在etcd解压的目录中 2.etcd.exe 没有erro ...
- 20145230java实验报告1
20145230实验一JAVA开发环境熟悉 使用JDK编译.运行简单的JAVA程序 实验要求 •使用JDK编译.运行简单的Java程序: •使用IDEA 编辑.编译.运行.调试Java程序. 实验内容 ...
- Cocos2d-x项目移植到WP8系列之一:前传
原文链接: http://www.cnblogs.com/zouzf/p/3969993.html 许久没动笔了,随想一直都有动笔的想法,但拖来拖去,归根到底还是一个懒字吧 .发现人的惰性真是太强大了 ...