1.Ice Run Time 概述
按照个人暂时的理解,Icerun Time具体是指Ice封装好了大部分的API,通过这些API实现分布式应用程序运行时的各种功能。
首先,其中一个重要的部分是通信器,它是Ice run time的主句柄,也是Ice run time的主进入点。另外Ice一个重要的机制是servant定位器,用于控制性能和内存消耗之间的平衡。其他一些同样不可缺少的组成部分接下来将会进行介绍。
2.通信器
Icerun time 的主进入点由本地接口Ice::Communicator 表示。Ice::Communicator 的一个实例与一些运行时资源是关联在一起的:
1) 客户端线程池:确保客户端至少有一个线程可用于接受对未完成请求的答复处理。同时它可用于异步方法调用(AMI)。
2) 服务端线程池:负责接收到来的连接,并处理来自客户的请求。可用于异步分派(AMD)。
3) 配置属性:配置Icerun time的各方面属性。每个通信器有各自的属性集。
4) 对象工厂:实例化从已知基类继承而来的servant类。
5) 一个日志记录器对象:确定日志消息的处理方式。实现了Ice::Logger接口。
6) 一个统计对象:打印一些通信流量消息等。实现了Ice::Stats接口。
7) 一个缺省路由器:实现了Ice::Router接口。Glacier使用它实现了Ice的防火墙功能。
8) 一个缺省定位器:用于把对象标识解析为代理的对象。IcePack用于构建定位服务。
9) 一个插件管理器:用于给通信器增加特性的对象。ICESSL被实现为插件。
10) 对象适配器:负责分配到来的请求,并把请求分配给相应的servant处理。下一小节将会具体介绍。
通信器提供了一些操作:
1) proxyToString , stringToProxy:这两个操作将代串化,或者相反。
2) createObjectAdapter ,createObjectAdapterWithEndpoints:创建新的对象适配器。
3) shutdown:关闭服务端的Icerun time
4) waitForShutdown:挂起发出调用的线程,直到通信器关闭为止。
5) destroy:销毁通信器及相关资源,例如线程,通信端点以及内存资源。
3.对象适配器
3.1概述
一个通信器含有一个或者多个对象适配器。对象适配器处在Ice run time和服务器之间的界线上,负责;
1) 把ice对象映射到到来请求的servant,并把请求分配给相应servant对象来处理。
2) 协助进行生命周期操作,避免出现Ice对象和servan的建立与销毁时出现冲突。
3) 提供一个或者多个传输端点。每个适配器有一个或多个servant。
3.2 活动Servant映射表
每个对象适配器都维护有一个叫做活动servant映射表(ASM: Active Servant Map)。活动表的作用可以用一下这图表示:
因此它的功能可以描述为:把请求绑定到相应的正确的servant。图中示例用了直接代理,它将传输端点嵌在了代理中。
3.3)Servant激活与解除激活
激活的意思是指:向Ice run time告知某个ice对象的servant的存在。具体操作就是将servant对象指针添加到ASM表中。
与之相反的操作叫做接触激活。这些操作在接口中定义为:
module Ice {
local interface ObjectAdapter {
// ...
//add:把一个具有标志的servant增加到ASM中,返回值是这Servant体现的对象的代理
Object* add(Object servant,Identity id);
//addWithUUID:和add相似,不过程序会自动添加Ice对象的标识;可以通过ice_getIdentity来获取该对象代理
Object* addWithUUID(Object servant);
//从ASM中解除相应的servant条目
void remove(Identity id);
// ...
};
};
3.)适配器的状态:
a)activate:活动状态,适配器可以进行连接过来的请求的分派工作。
b)hold:扣留状态,此时到达过来的请求会被扣留,不会被分派到相应的servant处理。
发出调用的线程会立即返回,不会等待操作完成。
c)waitForHold:挂起发出调用的线程,直到适配器状态移到扣留状态。
d)Deactivate:之后到达的请求会被拒绝,但正在执行的请求可以完成。
e)WaitForDeactivate:挂起发出调用的线程,直到适配器迁移到Deactivate状态为止。
参考资料:《Ice1.3.0(马维达 译)》和《Ice3.4.2 Manual》