分享

[ICE]ICE实例程序FOR_JAVA

 跃来跃去 2010-06-08

正好手里的这活儿要用到这块了。顺便就学习了一下。做了一个简单的 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就可以完成安装了。
安装完成后配置环境变量。
然后在PATH变量中加入%ICE_HOME%\bin后。保存退出。打开cmd命令行。

输入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命令来编译定义。生成相应的目录。如图所示:

到此,定义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能给大家提供帮助。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多