bboyjing's blog

尝试ZeorC ICE之【Hello World】

这一篇我们以一个简单的例子来跑通Ice,顺便慢慢地搭建项目的框架。

安装gradle

项目的构建工具选用gradle,至于为什么,后面就知道了。Gradle官网官网有详细的安装步骤,这里就不赘述了。

新建项目

开发工具我用的是IDEA,安装个Gradle插件即可。在之前的attempt_ice目录下新建一个项目ice_hello,直接在IDEA中通过图形界面新建gradle项目就没啥好说了。对了,把【初识】篇章建的测试文件demo.ice、interface.ice还有生成的目录都删了吧,留着碍眼。gradle项目的结构和maven一样,如果创建的项目没有src目录,执行以下步骤:

  1. 在build.gradle文件中添加如下task:

    1
    2
    3
    4
    task "create-dirs" << {
    sourceSets*.java.srcDirs*.each { it.mkdirs() }
    sourceSets*.resources.srcDirs*.each { it.mkdirs() }
    }
  2. 在ice_hello目录下执行gradle create-dirs,随后会自动生成src目录、以及子目录,然后删除上述脚本。

最后添加在dependencies中添加ice的依赖:compile(group: 'com.zeroc', name: 'ice', version: '3.6.3')

接口文件

在src/main目录下新建slice文件夹,用于存放基于Slice语言的*.ice文件,新建HelloWorld.ice:

1
2
3
4
5
6
7
8
// 指定上层包名
[["java:package:cn.didadu.generate"]]
// module和Java的Package对应
module helloworld {
interface HelloWorldService {
string hello();
};
};

这里我们多加了配置java:package,最终生成的java文件会在cn.didadu.generate.helloworld包下。
在ice_hello目录下执行slice2java --output-dir ./src/main/java ./src/main/slice/HelloWorld.ice,目前目录结构如下:
zeroc_ice_4
暂且先不管这些文件到底是什么,我们接着看怎么用。

实现Service

在cn.didadu下新建service包,存放我们将要实现的service类,新建HelloServiceImpl.java:

1
2
3
4
5
6
public class HelloWorldServiceImpl extends _HelloWorldServiceDisp {
@Override
public String hello(Current __current) {
return "Hello World!";
}
}

HelloWorldServiceImpl继承自之前生成的文件。

实现提供服务逻辑

在cn.didadu下新建ServerStarter.java,用于启动服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class ServerStart {
public static void main(String[] args) {
Ice.Communicator ic = null;
try {
// 初始化Communicator,该组件负责处理网络通信,实现RPC调用
ic = Ice.Util.initialize();
// 创建提供服务的站点,缺省协议为TCP/IP,端口为10000
Ice.ObjectAdapter adapter = ic.
createObjectAdapterWithEndpoints("MyServiceAdapter", "default -p 10000");
// 创建具体提供服务的实例
HelloWorldServiceImpl servant = new HelloWorldServiceImpl();
// 将服务实例添加到提供服务的站点
adapter.add(servant, Ice.Util.stringToIdentity("HelloService"));
// 激活服务站点
adapter.activate();
System.out.println("server started");
ic.waitForShutdown();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ic != null) {
ic.destroy();
}
}
}
}

实现客户端调用

在cn.didadu下新建Client.java,用于调用服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Client {
public static void main(String[] args) {
Ice.Communicator ic = null;
try {
// 初始化网络通信组件
ic = Ice.Util.initialize();
// 通过名称、协议、端口,构造通用Proxy对象
Ice.ObjectPrx base = ic.stringToProxy("HelloService:default -p 10000");
// 将通用Proxy对象转为真实的服务(uncheckedCast(base)可以减少一次远程调用)
HelloWorldServicePrx prxy = HelloWorldServicePrxHelper.checkedCast(base);
if (prxy == null) {
throw new Error("Invalid proxy");
}
// 调用服务
System.out.println(prxy.hello());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ic != null) {
ic.destroy();
}
}
}
}

至此,我们就跑通了Ice,当然只是非常简单的例子,没有什么实际用途。从目前个人的使用感受,以及开源社区的氛围来看,要把这个产品引入到实际项目中,并不是件容易的事儿。本篇就写到这里了。