今天在公司调试ice的时候,出现了一个ObjectNotExistException的异常,这个异常是server返回给client,
server是用java编写的,client是用php编写的,用ice来实现php和java的协作。
遇到ObjectNotExistException这样的异常,当时google了一下,知道是客户请求所包含的对象标识没有对应的条
目,也就是连接已经建好了,但是client请求的对像不存在,所以才有这样的异常。当时只是略看了一下,没有作仔细阅读,也没有完全弄明明白白,回家后感觉到老是有点放不下
如果要把原理弄清楚,下面这几天必须清楚
活动Servant 映射表,也叫active servant map,简称为asm
这个表的数据结构有点像路由表,网络的路由表就是这种结构
每个对象适配器都维护有一个叫作活动servant 映射表,就是asm
用于把对象标识映射到servant,
当客户把操作调用发给服务器时,请求的目标是特定的传输端点。传输端
点隐含地标识了请求所针对的对象适配器(因为同一个端点只能绑定到一
个对象适配器)。客户藉以发送请求的代理含有对应的对象的标识,客户
端run time 会在线路上随调用一起发送这个对象标识。对象适配器继而使
用这个对象标识、在它的ASM 中查找正确的servant,把调用分派给它。
如上图所示。
Servant
servant 是Ice 对象的物理体现,也就是说,它们是
用具体的编程语言实现的实体,并且在服务器的地址空间中进行实例化。
Servants 为“客户发送的操作调用”提供服务器端行为。
同一个servant 可以向一个或更多对象适配器注册