IceGrid 最佳入门例了

折腾了两天终于搞定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

客户端PrinterClient

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

该例子中,配置文件中   “适配器名”,“对象标识名  ” 需要与程序中一至。



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值