ICE实例程序



  正好手里的这活儿要用到这块了。顺便就学习了一下。做了一个简单的 for_java的demo出来。供大家使用的时候参考参考。

如果是使用eclipse开发的,可以参考:http://hi.baidu.com/dd_taiyangxue/blog/item/cc7f014442b4a82acffca382.html

这个文章是在eclipse下借助slice2Java的插件来完成的。这里咱用的是idea。所以就已idea为主了。

1. ICE安装与配置。

下载Ice-3.4.0.msi这个文件放在本地一路next就可以完成安装了。

ICE实例程序_第1张图片

安装完成后配置环境变量。
然后在PATH变量中加入%ICE_HOME%\bin后。保存退出。打开cmd命令行。

ICE实例程序_第2张图片

输入slice2java后出现选项提示说明配置成功了。可以下一步了。

2.编写slice定义。

编写任何ICE应用的第一步都是要编写一个slice定义。其中包含了这个应用所用的所有接口。直接在项目中的/src/main/java目录下创建.ice文件。这里就暂时叫promotionWare.ice。

内容如下:

module com {
module jd {
module promotion {
module web {
module ware {
/** 促销商品实体 **/
struct PromotionWare {
int id;
string name;
};
/** 促销商品服务接口 **/
interface PromotionWareService {
/**
* 获取促销商品
* @param id 商品id
**/
PromotionWare getWareById(long id);
};
};
};
};
};
};来解释一下。这里我们定义了一个叫做PromotionWareService的接口。目前这个接口只提供一个操作。叫做getWareById。通过传入商品ID获取商品信息。
而这个商品信息PromotionWare就是上边定义的struct PromotionWare 实体。其中这个实体包含了id,name两个属性。具体的类型对照可参看Ice-3.4.0开发手册中文版.pdf中的介绍。很是详细。
至于这个module就相当于java中的package。上边我们定义的就相当于package com.jd.promotion.web.ware
这里需要注意的是。如果内层的module名称如果在外层定义过,则编译时无法通过。比如:com.jd.promotion.web.promotion.ware。因为promotion已经定义过。所以无法再定义一次。
编写完以后就需要编译我们的这个slice定义来生成JAVA的代理和框架。
在cmd中进入到.ice所在的目录。使用slice2java promotionWare.ice命令来编译定义。生成相应的目录。如图所示:ICE实例程序_第3张图片到此,定义slice和编译已经完成了。然后还有一步要做的就是在工程中加入ice的jar包。
3.编写编译服务器
目的就是为了实现我们之前定义的PromotionWareService接口。我们必须创建一个servant类。至于servant是什么,我的理解是它就是ice对象的一个标识。每个ice对象都会映射到相应的servant下。在服务启动的时候每个ice对象实例化出来一个servant,然后激活并处理每个相应的请求。
按照文档上的规则。servant的命名规则就是接口名字加上I。所以我们这个servant的名字就是 PromotionWareServiceI。
以下为servant代码。

package com.jd.promotion.web.ware; 
/** 
* User: hanxy 
* Date: 2010-6-8 
* Time: 12:47:23 
*/ 
public class PromotionWareServiceI extends _PromotionWareServiceDisp { 
public PromotionWare getWareById(long id,Ice.Current current) { 
PromotionWare pw = null; 
if(id==110100) { 
pw = new PromotionWare(110100,"这个是测试的"); 
} 
return pw; 
} 
} 
 

 这里实现了接口中定义的getWareById。但不同的是这里多了一个Ice.Current的参数。这里我们暂时不需要用到它。所以先不讨论它的作用了。
4.编写server端
接着是服务器段代码。定义为PromotionWareServer.java

package com.jd.promotion.web.ware;
/**
* User: hanxy
* Date: 2010-6-8
* Time: 13:02:19
*/
public class PromotionWareServer {
public static void main(String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
ic = Ice.Util.initialize(args); //初始化ice run time
   Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000");
Ice.Object object = new PromotionWareServiceI(); //服务器端run time初始化完毕。实例化一个WareServiceI对象。为接口创建servant
   adapter.add(object, Ice.Util.stringToIdentity("SimplePrinter"));
adapter.activate(); //激活适配器。适配器开始是holding状态创建的。
   ic.waitForShutdown();
} catch(Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch(Exception e) {
System.err.println(e.getMessage());
status = 1;
} finally {
if (ic != null)
ic.destroy();
}
System.exit(status);
}
}

 5.编写client端代码
编写好了服务器端,那么就剩下客户端去调用了。这里我们定义

PromotionWareClient.java
package com.jd.promotion.web.ware;
/**
* User: hanxy
* Date: 2010-6-8
* Time: 13:03:56
*/
public class PromotionWareClient {
public static void main(String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
ic = Ice.Util.initialize(args);
Ice.ObjectPrx base = ic.stringToProxy("SimplePrinter:default -h 192.168.1.84 -p 10000");
PromotionWareServicePrx pwsp = PromotionWareServicePrxHelper.checkedCast(base);
if(pwsp == null) {
throw new Error("Invalid proxy");
}
PromotionWare pw = pwsp.getWareById(110100);
System.out.println("name is :"+pw.name);
} catch (Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
} finally {
if (ic != null)
ic.destroy();
}
System.exit(status);
}
}

 最后都完成后我们要运行以下来测试测试。首先启动server端。然后启动client端。最后可以看到在控制台输出内容
这里输出的name is:这个是测试的。就是我们在client端的
PromotionWare pw = pwsp.getWareById(110100);
System.out.println("name is :"+pw.name);
到此为止一个简单的demo就完成了。其实真的是很简单很容易上手。这也是参照着开发手册的demo改出来的。看文档的时候发现有很多地方在后边的章节都是需要优化的。ice的强大远不止这些。还需要继续学习呵呵。希望这个demo能给大家提供帮助。

 

 

你可能感兴趣的:(eclipse,应用服务器,Web,框架,idea)