折腾了两天终于搞定IceGrid 入门例子。本例子在win7下使用eclipse 开发,单registry 配置多note ,服务端和客户端都是使用java来实在。
代码相关
使用的slice (Printer.ice)内容如下:
module Demo {
interface Printer
{
void printString(string s);
};
};
生成的代码包,如图所以
PrinterImpl.java 是类务实现类,内容如下
package Demo;
import org.apache.log4j.Logger;
import Ice.Current;
/**
* ice java server 业务实现类
* @author peidw
*
*/
public class PrinterImpl extends _PrinterDisp {
private static Logger logger=Logger.getLogger("");
@Override
public void printString(String s, Current __current) {
// TODO Auto-generated method stub
System.out.println("-----------------"+s);
logger.info("收到请求:"+s);
}
}
PrinterServer.java是服务类。
package Demo;
/**
* ice 例子
* 部署 在icegrid 里,运行server类必须继承Ice.Application
* @author peidw
*
*/
public class PrinterServer extends Ice.Application{
@Override
public int
run(String[] args)
{
if(args.length > 0)
{
System.err.println(appName() + ": too many arguments");
return 1;
}
Ice.ObjectAdapter adapter = communicator().createObjectAdapter("PrinterAdapter");
Ice.Properties properties = communicator().getProperties();
Ice.Identity id = communicator().stringToIdentity(properties.getProperty("Identity"));
System.out.println("Ice.Identity id ="+id.name);
Ice.Object object = new PrinterImpl();
adapter.add(object, communicator().stringToIdentity("SimplePrinter"));
adapter.activate();
communicator().waitForShutdown();
return 0;
}
static public void
main(String[] args)
{
PrinterServer app = new PrinterServer();
String conf = "D:\\ZeroC\\pserver.cfg";
int status = app.main("Server", args,conf);
System.exit(status);
}
pserver.cfg内容如下:
PrinterAdapter.AdapterId=PrinterAdapter
PrinterAdapter.Endpoints=tcp
package client;
public class PrinterClient extends Ice.Application{
@Override
public int run(String[] args) {
//获取Printer的远程代理,这里使用的stringToProxy方式
Ice.ObjectPrx base = communicator().stringToProxy("SimplePrinter");
//通过checkedCast向下转换,获取Printer接口的远程,并同时检测根据传入的名称获取的服务单元是否Printer的代理接口,如果不是则返回null对象
Demo.PrinterPrx printer = Demo.PrinterPrxHelper.checkedCast(base);
if (printer == null) throw new Error("Invalid proxy");
//把Hello World传给服务端,让服务端打印出来,因为这个方法最终会在服务端上执行
for(int i = 0;i<10;i++){
printer.printString("xxx"+i);;
}
return 0;
}
public static void main(String[] args){
PrinterClient app = new PrinterClient();
System.exit(app.main("client", args,"D:\\ZeroC\\client.cnf"));
}
}
client.cnf内容如下:
Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 127.0.0.1 -p 4061
IceGrid 相关配置文件
1、registry.cfg
IceGrid.InstanceName=SzcIceGrid
#客户端连接到注册中心的地址
IceGrid.Registry.Client.Endpoints=tcp -p 4061
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
IceGrid.Registry.PermissionsVerifier=SzcIceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=SzcIceGrid/NullPermissionsVerifier
#注册中心数据保存路径,需要手动创建文件夹
IceGrid.Registry.Data=F:\ice\Printer\registry
IceGrid.Registry.DynamicRegistration=1
Ice.Admin.InstanceName=AdminInstance
Ice.Admin.ServerId=Admin
2、node1.cfg
# 注册中心地址
Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 127.0.0.1 -p 4061
#node名
IceGrid.Node.Name=node1
IceGrid.Node.Endpoints=tcp
#node存储路径
IceGrid.Node.Data=F:\ice\Printer\node1
IceGrid.Node.Output=F:\ice\Printer\node1
IceGrid.Node.CollocateRegistry=0
3、node2.cfg
# 注册中心地址
Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 127.0.0.1 -p 4061
IceGrid.Node.Name=node2
IceGrid.Node.Endpoints=tcp
IceGrid.Node.Data=F:\ice\Printer\node2
IceGrid.Node.Output=F:\ice\Printer\node2
IceGrid.Node.CollocateRegistry=0
#IceGrid.Node.Trace.Replica=2
#IceGrid.Node.Trace.Activator=3
#IceGrid.Node.Trace.Adapter=3
#IceGrid.Node.Trace.Server=3
4、app.xml
<icegrid>
<application name="PrinterApplication">
<node name="node1">
<server id="PrinterServer" exe="java" activation="on-demand">
<adapter name="PrinterAdapter" endpoints="tcp -h 127.0.0.1">
<object identity="SimplePrinter" type="::Demo::Printer" property="Identity"/>
</adapter>
<option>-jar</option>
<option>F:\ice\Printer\printer.jar</option>
<property name="Ice.Trace.Network" value="1"/>
<properties>
<property name="Ice.ThreadPool.Server.SizeMax" value="1" />
</properties>
<property name="IceMX.Metrics.Debug.GroupBy" value="id"/>
<property name="IceMX.Metrics.Debug.Disabled" value="1"/>
<property name="IceMX.Metrics.ByParent.GroupBy" value="parent"/>
<property name="IceMX.Metrics.ByParent.Disabled" value="1"/>
</server>
</node>
</application>
</icegrid>
在app.xml中我们把生成的代码打包jar 包,其中printer.jar中,需要修改MANIFEST.MF文件,内容如下:
nifest-Version: 1.0
Class-Path: lib/ice-3.6.1.jar lib/commons-logging-1.1.1.jar lib/log4j-1.2.15.jar
Main-Class: Demo.PrinterServer
因为业务实现类依赖log4j和ice基础包,还有要设置主类。
IceGrid服务启动
我配置文件大部分放F:\ice\Printer,运行cmd ,cd F:\ice\Printer,依次执行
1、icegridregistry --Ice.Config=registry.cfg
cmd窗口不报错,F:\ice\Printer\registry目录中生成相应的文件。
2、icegridnode --Ice.Config=node1.cfg
不报错,并且F:\ice\Printer\node1 目录中生成相关文件。
3、icegridnode --Ice.Config=node2.cfg
4、部署过node1,命令如下:
icegridadmin --Ice.Config=node1.cfg
进入node1管理界面。
application add app.xml 或 application update app.xml
以新增或更新方式部署app.xml,界面没报错则ok。
5、启动服务
我通常 是java -jar D:\ZeroC\Ice-3.6.1\bin\icegridgui.jar,启动IceGrid管理界面再启动node1/PrintServer
如启动报错,可以到node对应的目录,查看PrinterServer.err或PrinterServer.out
该例子中,配置文件中 “适配器名”,“对象标识名 ” 需要与程序中一至。