2008-04-15
ZeroC ICE之旅------java
关键字: ice, 分布式
关于Ice请见,
ICE之轻量级分布式通讯中间件
http://masterkey.javaeye.com/blog/182954
ZeroC ICE之旅------C++
http://masterkey.javaeye.com/blog/183307
ZeroC ICE之旅------Slice
http://masterkey.javaeye.com/blog/184064
ZeroC ICE之旅------多语言互通互联
http://masterkey.javaeye.com/blog/183742
ZeroC ICE之旅------集群和容错
http://masterkey.javaeye.com/blog/185081
更多ICE文章,请关注:
Titan的天空
http://masterkey.javaeye.com
工欲善其事,必先利其器,我们首先从www.zero.com,下载最新安装包;
btw:
目前最新的v3.3
http://www.zeroc.com/download_beta.html
最新稳定版本:
http://www.zeroc.com/download.html
由于我自己的平台是CentOS release 4.4 (Final),java version "1.6.0_01"
所以下载的是:
http://www.zeroc.com/download/Ice/3.3/Ice-3.3b-rhel4-i386-rpm.tar.gz
解开之后:
-rw-r--r-- 1 506 users 1130231 4月 1 10:39 db46-4.6.21-2ice.rhel4.i386.rpm
-rw-r--r-- 1 506 users 51459 4月 1 10:39 db46-devel-4.6.21-2ice.rhel4.i386.rpm
-rw-r--r-- 1 506 users 810562 4月 1 10:40 db46-java-4.6.21-2ice.rhel4.i386.rpm
-rw-r--r-- 1 506 users 72125 4月 1 10:40 db46-utils-4.6.21-2ice.rhel4.i386.rpm
-rw-r--r-- 1 506 users 84281 4月 1 10:15 ice-3.3b-1.rhel4.noarch.rpm
-rw-r--r-- 1 506 users 450359 4月 1 10:15 ice-c++-devel-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 2823701 4月 1 10:16 ice-java-3.3b-1.rhel4.noarch.rpm
-rw-r--r-- 1 506 users 263085 4月 1 10:16 ice-java-devel-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 3439061 4月 1 10:17 ice-libs-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 162092 4月 1 10:19 ice-php-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 739055 4月 1 10:19 ice-python-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 32913 4月 1 10:19 ice-python-devel-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 223577 4月 1 10:19 ice-ruby-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 21406 4月 1 10:19 ice-ruby-devel-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 3657167 4月 1 10:20 ice-servers-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 4350193 4月 1 10:24 ice-utils-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 74856 4月 1 10:40 mcpp-devel-2.6.4-1ice.rhel4.i386.rpm
由于需要c和java的包:
所以我们仅安装:
rmp -ivh ice-3.3b-1.rhel4.noarch.rpm
rmp -ivh ice-3.3b-1.rhel4.noarch.rpm
rpm -ivh ice-3.3b-1.rhel4.noarch.rpm
rpm -ivh ice-libs-3.3b-1.rhel4.i386.rpm
rpm -ivh ice-utils-3.3b-1.rhel4.i386.rpm
rpm -ivh mcpp-devel-2.6.4-1ice.rhel4.i386.rpm
rpm -ivh ice-servers-3.3b-1.rhel4.i386.rpm
rpm -ivh ice-libs-3.3b-1.rhel4.i386.rpm
rpm -ivh ice-c++-devel-3.3b-1.rhel4.i386.rpm
rpm -ivh ice-java-3.3b-1.rhel4.noarch.rpm
rpm -ivh ice-java-devel-3.3b-1.rhel4.i386.rpm
安装之后的Ice相关路径:
slice2cpp,slice2java在/usr/bin/下
Ice.jar 存储于 /usr/share/java/下
相关的Ice的库存储于/usr/lib下.
一切就绪,我们开始Ice之旅的Slice地带:
首先,我们建立一个demo.ice的文件:
注意,后两个"}"一定要包含";",否则slice2java就会过不去,赫赫
执行:
slice2java demo.ice
会在当前目录产生一个Demo目录,目录下自动生成:
-rw-r--r-- 1 root root 2316 4月 15 17:01 _testDelD.java
-rw-r--r-- 1 root root 560 4月 15 17:01 _testDel.java
-rw-r--r-- 1 root root 1929 4月 15 17:01 _testDelM.java
-rw-r--r-- 1 root root 4177 4月 15 17:01 _testDisp.java
-rw-r--r-- 1 root root 1070 4月 15 17:01 testHolder.java
-rw-r--r-- 1 root root 488 4月 15 17:01 test.java
-rw-r--r-- 1 root root 481 4月 15 17:01 _testOperations.java
-rw-r--r-- 1 root root 460 4月 15 17:01 _testOperationsNC.java
-rw-r--r-- 1 root root 5418 4月 15 17:01 testPrxHelper.java
-rw-r--r-- 1 root root 569 4月 15 17:01 testPrxHolder.java
-rw-r--r-- 1 root root 567 4月 15 17:01 testPrx.java
到目前为止,demo.ice所以Ice接口部分的定义以及相关依赖都已经自动生成.
我们要实现自己的execute方法,覆盖testPrx.java的同名方法:
之后,我们建立一个Server服务在10000端口进行侦听。
貌似很复杂,其实里面的很多内容都是固定格式,有些部分需要固定和约定。其中上述红色部分是修改部分。
到目前为止,我们已经完成了大部分工作,我们还需要建一个客户端来对服务端的方法进行调用。
也貌似很复杂吧,其实不然,也很简单,同样包含很多固定格式。其中
是我们自己调用的逻辑。
赫赫,大功告成了,现在我们开始运行Server,再运行Client看到了么?
"My first Ice demo"
得到这样的结果,基本Ice之旅的Java部分简单实例我们基本完成。
Ice的性能和稳定性远超于我们的想象,skype知道么?其部分通讯架构就是采用的Ice.
ICE之轻量级分布式通讯中间件
http://masterkey.javaeye.com/blog/182954
ZeroC ICE之旅------C++
http://masterkey.javaeye.com/blog/183307
ZeroC ICE之旅------Slice
http://masterkey.javaeye.com/blog/184064
ZeroC ICE之旅------多语言互通互联
http://masterkey.javaeye.com/blog/183742
ZeroC ICE之旅------集群和容错
http://masterkey.javaeye.com/blog/185081
更多ICE文章,请关注:
Titan的天空
http://masterkey.javaeye.com
工欲善其事,必先利其器,我们首先从www.zero.com,下载最新安装包;
btw:
目前最新的v3.3
http://www.zeroc.com/download_beta.html
最新稳定版本:
http://www.zeroc.com/download.html
由于我自己的平台是CentOS release 4.4 (Final),java version "1.6.0_01"
所以下载的是:
http://www.zeroc.com/download/Ice/3.3/Ice-3.3b-rhel4-i386-rpm.tar.gz
解开之后:
-rw-r--r-- 1 506 users 1130231 4月 1 10:39 db46-4.6.21-2ice.rhel4.i386.rpm
-rw-r--r-- 1 506 users 51459 4月 1 10:39 db46-devel-4.6.21-2ice.rhel4.i386.rpm
-rw-r--r-- 1 506 users 810562 4月 1 10:40 db46-java-4.6.21-2ice.rhel4.i386.rpm
-rw-r--r-- 1 506 users 72125 4月 1 10:40 db46-utils-4.6.21-2ice.rhel4.i386.rpm
-rw-r--r-- 1 506 users 84281 4月 1 10:15 ice-3.3b-1.rhel4.noarch.rpm
-rw-r--r-- 1 506 users 450359 4月 1 10:15 ice-c++-devel-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 2823701 4月 1 10:16 ice-java-3.3b-1.rhel4.noarch.rpm
-rw-r--r-- 1 506 users 263085 4月 1 10:16 ice-java-devel-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 3439061 4月 1 10:17 ice-libs-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 162092 4月 1 10:19 ice-php-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 739055 4月 1 10:19 ice-python-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 32913 4月 1 10:19 ice-python-devel-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 223577 4月 1 10:19 ice-ruby-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 21406 4月 1 10:19 ice-ruby-devel-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 3657167 4月 1 10:20 ice-servers-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 4350193 4月 1 10:24 ice-utils-3.3b-1.rhel4.i386.rpm
-rw-r--r-- 1 506 users 74856 4月 1 10:40 mcpp-devel-2.6.4-1ice.rhel4.i386.rpm
由于需要c和java的包:
所以我们仅安装:
rmp -ivh ice-3.3b-1.rhel4.noarch.rpm
rmp -ivh ice-3.3b-1.rhel4.noarch.rpm
rpm -ivh ice-3.3b-1.rhel4.noarch.rpm
rpm -ivh ice-libs-3.3b-1.rhel4.i386.rpm
rpm -ivh ice-utils-3.3b-1.rhel4.i386.rpm
rpm -ivh mcpp-devel-2.6.4-1ice.rhel4.i386.rpm
rpm -ivh ice-servers-3.3b-1.rhel4.i386.rpm
rpm -ivh ice-libs-3.3b-1.rhel4.i386.rpm
rpm -ivh ice-c++-devel-3.3b-1.rhel4.i386.rpm
rpm -ivh ice-java-3.3b-1.rhel4.noarch.rpm
rpm -ivh ice-java-devel-3.3b-1.rhel4.i386.rpm
安装之后的Ice相关路径:
slice2cpp,slice2java在/usr/bin/下
Ice.jar 存储于 /usr/share/java/下
相关的Ice的库存储于/usr/lib下.
一切就绪,我们开始Ice之旅的Slice地带:
首先,我们建立一个demo.ice的文件:
module Demo{
interface test{
string execute(string mth,string cmd);
};
};
注意,后两个"}"一定要包含";",否则slice2java就会过不去,赫赫
执行:
slice2java demo.ice
会在当前目录产生一个Demo目录,目录下自动生成:
-rw-r--r-- 1 root root 2316 4月 15 17:01 _testDelD.java
-rw-r--r-- 1 root root 560 4月 15 17:01 _testDel.java
-rw-r--r-- 1 root root 1929 4月 15 17:01 _testDelM.java
-rw-r--r-- 1 root root 4177 4月 15 17:01 _testDisp.java
-rw-r--r-- 1 root root 1070 4月 15 17:01 testHolder.java
-rw-r--r-- 1 root root 488 4月 15 17:01 test.java
-rw-r--r-- 1 root root 481 4月 15 17:01 _testOperations.java
-rw-r--r-- 1 root root 460 4月 15 17:01 _testOperationsNC.java
-rw-r--r-- 1 root root 5418 4月 15 17:01 testPrxHelper.java
-rw-r--r-- 1 root root 569 4月 15 17:01 testPrxHolder.java
-rw-r--r-- 1 root root 567 4月 15 17:01 testPrx.java
到目前为止,demo.ice所以Ice接口部分的定义以及相关依赖都已经自动生成.
我们要实现自己的execute方法,覆盖testPrx.java的同名方法:
//TestImp.java
package Demo;
import Ice.Current;
public class TestImp extends _testDisp{
public String execute(String mth, String cmd, Current __current) {
// TODO Auto-generated method stub
return mth+cmd;
}
}看到了,就是这么简单,仅仅覆盖_testDisp里面的抽象方法,实现把我们自己的实现代码填充到里面就行了.
之后,我们建立一个Server服务在10000端口进行侦听。
//Server.java
package Demo;
public class Server {
public static void main(String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
ic = Ice.Util.initialize(args);
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(
"TestAdapter", "default -p 10000");
Ice.Object object = new TestImp();
adapter.add(object, ic.stringToIdentity("TestAdapter"));
adapter.activate();
ic.waitForShutdown();
} catch (Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
}
if (ic != null) {
// Clean up
//
try {
ic.destroy();
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
}
}
System.exit(status);
}
}
貌似很复杂,其实里面的很多内容都是固定格式,有些部分需要固定和约定。其中上述红色部分是修改部分。
到目前为止,我们已经完成了大部分工作,我们还需要建一个客户端来对服务端的方法进行调用。
package Demo;
public class Client {
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:tcp -h 172.17.12.101 -p 10000");
Ice.ObjectPrx base = ic
.stringToProxy("TestAdapter:default -p 10000");
testPrx test = testPrxHelper.checkedCast(base);
if (test == null)
throw new Error("Invalid proxy");
System.out.println(test.execute("My first Ice ", "demo"));
//System.out.println("ok");
} catch (Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
}
if (ic != null) {
// Clean up
//
try {
ic.destroy();
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
}
}
System.exit(status);
}
}
也貌似很复杂吧,其实不然,也很简单,同样包含很多固定格式。其中
System.out.println(test.execute("my first Ice ", "demo"));
是我们自己调用的逻辑。
赫赫,大功告成了,现在我们开始运行Server,再运行Client看到了么?
"My first Ice demo"
得到这样的结果,基本Ice之旅的Java部分简单实例我们基本完成。
Ice的性能和稳定性远超于我们的想象,skype知道么?其部分通讯架构就是采用的Ice.
评论
masterkey
2008-04-24
我习惯自己操作配置文件,再对Ice的属性设置。
jaketyao
2008-04-24
感谢 博主的解答。
我在做ice demo 时候,icebox 在eclipse 无法启动。
这是为什么?
配置文件 放在project 中。
我在做ice demo 时候,icebox 在eclipse 无法启动。
这是为什么?
public class IceBoxRun {
public static void main(String[] args) {
System.out.println("启动ICEBOX");
// --Ice.Config=config
new Server().main("",
new String[] { "--Ice.Config=config" + "//" + "config.icebox" });
}
}
配置文件 放在project 中。
masterkey
2008-04-22
Client服务无法正常连接Server上。
首先,
检查你的网络是否正常.(Client和Server链路是否通畅?)
再在看一下Client连接地址是否和Server保持一致。
再看一下Server所在主机的防火器设置规则,是否允许Client连接?
首先,
检查你的网络是否正常.(Client和Server链路是否通畅?)
再在看一下Client连接地址是否和Server保持一致。
再看一下Server所在主机的防火器设置规则,是否允许Client连接?
jaketyao
2008-04-22
再问个问题,这个是什么错误。。
Ice.ConnectionRefusedException
error = 0
at IceInternal.Network.doConnect(Network.java:320)
at IceInternal.TcpConnector.connect(TcpConnector.java:25)
at IceInternal.OutgoingConnectionFactory.create(OutgoingConnectionFactor
y.java:323)
at IceInternal.RoutableReference.createConnection(RoutableReference.java
:433)
at IceInternal.DirectReference.getConnection(DirectReference.java:199)
at Ice._ObjectDelM.setup(_ObjectDelM.java:258)
at Ice.ObjectPrxHelperBase.__getDelegate(ObjectPrxHelperBase.java:1050)
at Ice.ObjectPrxHelperBase.ice_isA(ObjectPrxHelperBase.java:85)
at Ice.ObjectPrxHelperBase.ice_isA(ObjectPrxHelperBase.java:61)
at com.sitechasia.webx.ice.user.services.PersonalAbServcies.LinkmanServi
cesPrxHelper.checkedCast(LinkmanServicesPrxHelper.java:388)
at com.sitechasia.webx.user.ice.IceClientTest.init(IceClientTest.java:28
)
at com.sitechasia.webx.user.ice.IceClientTest.savaLinkman(IceClientTest.
java:50)
Ice.ConnectionRefusedException
error = 0
at IceInternal.Network.doConnect(Network.java:320)
at IceInternal.TcpConnector.connect(TcpConnector.java:25)
at IceInternal.OutgoingConnectionFactory.create(OutgoingConnectionFactor
y.java:323)
at IceInternal.RoutableReference.createConnection(RoutableReference.java
:433)
at IceInternal.DirectReference.getConnection(DirectReference.java:199)
at Ice._ObjectDelM.setup(_ObjectDelM.java:258)
at Ice.ObjectPrxHelperBase.__getDelegate(ObjectPrxHelperBase.java:1050)
at Ice.ObjectPrxHelperBase.ice_isA(ObjectPrxHelperBase.java:85)
at Ice.ObjectPrxHelperBase.ice_isA(ObjectPrxHelperBase.java:61)
at com.sitechasia.webx.ice.user.services.PersonalAbServcies.LinkmanServi
cesPrxHelper.checkedCast(LinkmanServicesPrxHelper.java:388)
at com.sitechasia.webx.user.ice.IceClientTest.init(IceClientTest.java:28
)
at com.sitechasia.webx.user.ice.IceClientTest.savaLinkman(IceClientTest.
java:50)
masterkey
2008-04-21
好像没有 proxyToProxy 吧。
stringToProxy 和proxyToString是互逆操作。
你提的是 propertyToProxy ?
这个在
装载属性文件之后。
My.Proxy为proxy.properties中的一个属性项。
例如:
proxy.properties 内容如下:
stringToProxy 和proxyToString是互逆操作。
你提的是 propertyToProxy ?
这个在
ic.getProperties().load("proxy.properties");
装载属性文件之后。
Ice.ObjectPrx base = ic.propertyToProxy("My.Proxy");
My.Proxy为proxy.properties中的一个属性项。
例如:
proxy.properties 内容如下:
My.Proxy=TestAdapter:tcp -h 172.17.12.101 -p 10000
jaketyao
2008-04-20
stringToProxy 和 proxyToProxy 有啥区别?
至今有点困惑!
至今有点困惑!
masterkey
2008-04-18
官方的doc很厚,1700多页,内容很丰富
jaketyao
2008-04-18
关注当中。。。。
感觉用起来不错。。。。。
就是中文资料少了。
感觉用起来不错。。。。。
就是中文资料少了。
coolmenu
2008-04-17
腾讯也在用ICE作内部的一个项目
masterkey
2008-04-17
它的出现,主要是Corba的替代产品,更轻量级,更高效,功能丰富。
它的易用性非常好。上手比较快。功能很强大。
感觉,国内用户不是很多,尽管有些国内公司在用,他们也从来不说。
觉得随着时间的推荐,我相信,Ice会成为很多公司在分布式通讯架构的首选。
如果我记得没错的话:mop好像在使用ICE,client好像是php的。
赫赫
它的易用性非常好。上手比较快。功能很强大。
感觉,国内用户不是很多,尽管有些国内公司在用,他们也从来不说。
觉得随着时间的推荐,我相信,Ice会成为很多公司在分布式通讯架构的首选。
如果我记得没错的话:mop好像在使用ICE,client好像是php的。
赫赫
dayn9
2008-04-17
我也很喜欢ICE,我刚刚部署了一个基于ICE-Grid的网格,感觉不错。
但ZeroC生不逢时,前景十分让人担心,两年来,我一直担心他会突然挂掉。
但ZeroC生不逢时,前景十分让人担心,两年来,我一直担心他会突然挂掉。
masterkey
2008-04-17
建议还是使用3.2.1版本。3.3还是beta版本。
你可以使用Server采用 C++,客户端采用:Java/Python/PHP等多种形式。
基于C++的实现相比要快于其它语言的实现。
主要还看你们自身应用的结构,数据包的大小,Ice也支持UDP,不过要控制每个数据包的大小,也支持数据包的压缩等。
你可以使用Server采用 C++,客户端采用:Java/Python/PHP等多种形式。
基于C++的实现相比要快于其它语言的实现。
主要还看你们自身应用的结构,数据包的大小,Ice也支持UDP,不过要控制每个数据包的大小,也支持数据包的压缩等。
coolmenu
2008-04-17
我们内部也一直用的Ice,最近准备用c++写一些服务,看看java/c++的性能差距,另外3.3beta版本出来了,改进了异步调用的性能
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 26762 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
nginx 0.7.1 release
我发现discuz已经在用nginx7.0,那说明这个版本已经完全可以运用于商业 ...
-- by Arden -
nginx 0.7.1 release
这是开发版
-- by 剑 事 -
各个浏览器并发连接数比较
你混淆概念了! keepalive仅仅是建立一个通道,多数据传输,避免多次握手 ...
-- by masterkey -
各个浏览器并发连接数比较
没考虑keepalive不算数
-- by ShiningRay -
我看<赢在中国>
我觉得第二赛季的比较不错
-- by davis129






评论排行榜