参考http://doc.zeroc.com/display/Ice/IceBox
IceBox是一个易用的ice应用服务的框架。它使用通用的IceBox server来取代一般的Ice server。IceBox server通过属性来配置,可以被远程管理。这种架构有很多优点如下:
1.一个IceBox server启动的几个服务可以获得 Ice's collocation optimizations提供的优化。
2.多种服务的组合可以通过配置来完成,不用编译和连接。他把服务和server解耦。
3.多个JAVA服务可以被一个JVM激活,而不是每个服务都有一个JVM。
4.服务实现IceBox service接口,为开发人员提供了统一的框架和集中化管理。
5.IceBox被整合在IceGrid中。
IceBox提供了一种耳目一新的观点。开发者集中于编写服务,而不是应用程序。使用IceBox,一个程序变成了一些离散的服务集合,他们的组合由配置来动态产生。
Developing IceBox Services
写一个IceBox service 需要实现一个接口,如下
module IceBox {
local interface Service {
void start(string name, Ice::Communicator communicator, Ice::StringSeq args);
void stop();
};
};
一个service需要实现2个操作start和stop。这些操作被IceBox server调用,start在service被加载后调用,stop在server被关闭时调用。
start使service能够初始化自己,一般是创建adapter和servant。
name和args通过IceBox加载的配置文件传递进来的。
communicator是IceBox server创建的。根据service的配置,communicator可能被IceBox server下的其他service分享。因此,要注意,给不同服务的适配器,起不同的名字。
Stop用来释放资源。如_adapter->destroy();也可以使用waitForDeactivate ,这可以保证在adpater撤销前,其中的数据能够全部发送出去。Start中传递过来的communicator的实例的释放,由server负责。
有些情况,stop中不用销毁adapter。比如,多个service共享一个communicator,并且service最后会被重启。
Service还可以让他的adapter随communicator一起销毁。
这些接口都是本地接口,代表server和service的一种契约,并不能用来和客户端远程连接。和远程客户的通信是通过servant来进行的。
C++示例代码可以在ZeroC\Ice-3.5.1-demos\demo\IceBox\hello中找到。
Configuring IceBox Services
Service编译出来的是一个库文件,我们通过配置文件,使 IceBox server来加载库文件,并运行其中的service。
配置属性如下
IceBox.Service.name=entry_point [args]
其中,name是service的名字,它会被传递到之前介绍的start方法中,service的名字必须是唯一的。
entry_point 代表库名字和入口函数。比如HelloService:create代表加载HelloService.dll,他的入口函数create。注意库的名字不需要后缀。
Args部分,会经过检查,其中有--name=value这种形式的参数,会被作为属性定义,剩下的参数,会被传到start中的args中。比如
IceBox.Service.Hello=HelloService:create --Ice.Trace.Network=1 hello there
--Ice.Trace.Network=1 是属性定义
Hello和there作为2个元素被传递到start的args中。
Starting the IceBox Server
以ZeroC\Ice-3.5.1-demos\demo\IceBox\hello为例
首先编译helloservice工程。得到helloserviced.dll,这就是我们的服务。
Config.icebox是配置文件。
#
# The hello service
#
IceBox.Service.Hello=helloservice:create --Ice.Config=config.service
可以指定hello service中adapter的网络节点信息
Hello.Endpoints=tcp -p 10001
之后在CMD中执行
icebox --Ice.Config=config.icebox
使用icebox读取配置文件来加载service。
在运行client,发送信息。Service就能接收到。
还可以把IceBox配置成windows service。这里先不做介绍。