ICE 学习

ice是一个对象中间件,可用多系统间通信。

  • 1. 它提供了slice语言机制,将x.ice映射成各种语言,以消除各编辑语言之间的差别。多语言系统可用。
  • 2. 提供了rpc远程调用机制。
  • 3. 组件化, 提供了icegrid, icebox, icepack等更为方便 。


机制与原理
一、communicator连接器。是ice run time最为主要的, 它包含了一些主要信息:
  

  • a. 线程池(server, client)
  •    b. 日志记录(Ice.Logger)
  •    c. 统计(Ice.Stats)
  •    d. 对象适配器(Ice.Adapter)
  •    e. Ice.Router
  •    f. Ice.ServantLocator


因此它当中的方法也一般也上面那些相关。最为关键是的程序退出要清理,最好一个注册退出钩子:Runtime.getRuntime().addShutdownHook();
 
二、ObjectAdapter(对象适配器)
   上接commumicator, 下对servant.提供ice对象与sevrvant的映射。称为asm表(active servant map)。
    通过add(servant, identity)来绑定,remove来解除绑定。
   有三种状态.
    hold, 不接受新的连接请求, 但已连接的发送请求可以接受,会发出TimeoutException(除非当中变为activate)
    activate,
    deactivate。不活动也就是销毁状态,不接受任何请求。
三、上下文
    Ice.Current 对于每个实现的接口最后一个参数都有一个这样的,它可以用于token来安全机制。
      
四、servant查找

  • 1. 当请求到Adapter时候,会在 ASM中查找该标识。如果 ASM 有这样一个条目,就把请求分派到对应的 servant。
  • 2. 如果到来的对象标识的范畴不是空的,就查找针对该范畴注册的 servant定位器。如果有这样的 servant 定位器,就调用这个定位器的locate.如果locate 返回一个 servant,就把请求分派到该 servant,然后调用finished ;而如果locate 调用返回 null,就在客户端引发ObjectNotExistException。
  • 3. 如果到来的对象标识的范畴是空的,或者在第 2步找不到针对该范畴的servant 定位器,就去查找缺省的 servant 定位器 (也就是,针对空范畴注册的 servant 定位器) 。如果有缺省的 servant 定位器,就像第 2 步那样分派请求。
  • 4. 在客户端ObjectNotExistException。,


五、异步
    ice异步有两种形式,一种是客户端的ami形式。另一种是服务器端的amd
    在3.4.1中时ami已经不用显示指定slice时就会生成callback类,在客户端直接用say()是同步的,begin_say(name, callback)就是异步的。  
amd得显示指定了,指定后方法的实现变为:sayHello_async(AMD_Hello_sayHello cb, int delay, Ice.Current current)。
   需要自己队列来存储cb,执行操作后cb.ice_response返回客户端,用Exector很好实现。
   (这样做好处是可以提高服务的接收能力不会因为线程池数量不够而不接受请求,但处理能力还是一样的,有可能由于接受太多,处理不过来而造成更大的问题,如内存等,原来的同步加ice本生的线程池已经足够了)

实践与问题
a. ice对于内置参数的null时默认置成空值, stirng => "", dictionary => {}, 因为ice在写数据时_os.write(value);会直接出空异常
  这样对自己的定义返回struct,class时就不能为null, 要实例化一个再返回 
b. slice不支持版本,对于定义的数据或接口若后面要改很不方便。要重新slice2XXX。 客户端,服务端都得动,特别是有时候接口参数多一个时,相等于重写了。 
  接口定义时额外加<string, string>一个参数用扩展
  数据定义时额外加<string, string>一个参数用扩展,

c. 对于包层级高有时多那么多的module,可用如下元数据

Java代码  收藏代码
  1. [[java:package:com.shguo.ice]]  
  2. module test{  
  3.     dictionary<long, string> longStringMap;  
  4.     interface ServiceA{  
  5.         string hello(string name);  
  6.     }  
  7. }   


d. 只提供bool, byte, int, long, float, double, string, sequeue, dictionary, struct, class, interface,没有date, 将要自己将date转为string.
   有些繁琐。
e. Object* 指的是返回代理(体现为Prx)。

f. 有用的属性:

Java代码  收藏代码
  1. Ice.Default.Host=host  
  2. Ice.Default.Protocol=tcp  
  3. Ice.RetryIntervals=num [num ...]  
  4. Ice.Default.Locator=locator  
  5.   
  6. Ice.Override.Timeout  
  7. Ice.Override.ConnectTimeout=num  
  8.        
  9. name.Endpoints=endpoints  
  10. name.Locator=locator  
  11.   
  12. Ice.ThreadPool.Client  Size, SizeMax, SizeWarn  
  13. Ice.ThreadPool.Server  Size, SizeMax, SizeWarn 
posted @ 2011-11-23 16:10  tangr206  阅读(718)  评论(0)    收藏  举报