Ice 分布式程序设计
Michi Henning
Mark Spruiell
以下人士为本文档做出了贡献
Benoit Foucher, Marc Laukien,
Matthew Newhook, Bernard Normier
马维达 译
制造商和销售商用来区分其产品的许多名称已被声明为商标。如果这些名称在本书中出现,而
且 ZeroC 注意到其商标声明,则名称的首字母或所有字母会大写。
本书的作者及出版者精心制作了本书,但不提供任何类型的担保,无论是明确的还是隐含,同
时也不对错误或疏漏承担任何责任。如果本书包含的信息或程序在使用时引发偶然或继起的损坏,
本书作者及出版者不承担任何责任。
版权所有 2004 by ZeroC,Inc.
http://www.zeroc.com
修订版 1.3.0,2004 年 3 月 1 日
本修订版文档描述的是 Ice1.3 版。
Ice 源码包使用了以下第三方产品:
Berkeley DB,由 Sleepycat Software 开发(http://www.sleepycat.com)
bzip2/libbzip2,由 Julian R. Seward 开发(http://sources.redhat.com/bzip2)
The OpenSSL Toolkit,由 OpenSSL Project 开发(http://www.openssl.org)
SSLeay,由 Eric Young 开发(mailto:eay@cryptsoft.com)
Expat,由 James Clark 开发(http://www.libexpat.org)
上述各产品的授权协议,见 Ice 源码包。
Note:文档中含有一些标注为"XREF"的交叉引用,它们指向的是还未写成、但将在未来加入的
内容。
目录
Ice 分布式程序设计 ................................................................... 1
第 1 章
引言 ................................................................... 16
1.1 节 引言 ................................................................... 16
1.2 节
Internet Communications Engine(Ice) .............................. 17
1.3 节 本书的篇章结构 ......................................................... 17
1.4 节 排字约定 ............................................................... 18
1.5 节 源码示例 ............................................................... 18
1.6 节 联系作者 ............................................................... 18
1.7 节
Ice 支持 ............................................................ 18
第一部分 Ice 综述 ................................................................... 19
第 2 章
Ice 综述 ................................................................ 19
2.1 节 本章综述 ............................................................... 19
Ice 架构 ............................................................ 19
2.2 节
2.2.1 引言 ............................................................... 19
2.2.2 术语 ............................................................... 19
2.2.3
Slice (Ice 规范语言) .............................................. 25
2.2.4 语言映射 ........................................................... 25
2.2.5 客户与服务器的结构 ................................................. 25
2.2.6
Ice 协议 ............................................................ 27
2.2.7 对象持久 ........................................................... 27
Ice 服务 ............................................................ 28
IcePack ............................................................ 28
IceBox ............................................................. 28
IceStorm ........................................................... 28
IcePatch ........................................................... 29
Glacier ............................................................ 29
2.4 节
Ice 在架构上提供的好处 .............................................. 29
2.5 节 与 CORBA 的对比 ......................................................... 30
2.5.1 对象模型的差异 ..................................................... 30
2.5.2 平台支持的差异 ..................................................... 31
2.5.3 复杂性上的差异 ..................................................... 32
Hello World 应用 ........................................................ 33
3.1 节 本章综述 ............................................................... 33
3.2 节 编写 Slice 定义 ......................................................... 33
3.3 节 编写使用 C++的 Ice 应用 .................................................. 33
3.4 节 编写使用 Java 的 Ice 应用 ................................................ 39
3.5 节 总结 ................................................................... 44
第二部分 Ice 核心概念 ............................................................... 45
第 4 章
Slice 语言 .............................................................. 45
4.1 节 本章综述 ............................................................... 45
4.2 节 引言 ................................................................... 45
4.3 节 编译 ................................................................... 45
2.3.1
2.3.2
2.3.3
2.3.4
2.3.5
2.3 节
第 3 章
4.3.1 客户与服务器使用同一种开发环境 ..................................... 46
4.3.2 客户和服务器使用不同的开发环境 ..................................... 47
4.4 节 源文件 ................................................................. 48
4.4.1 文件命名 ........................................................... 48
4.4.2 文件格式 ........................................................... 48
4.4.3 预处理 ............................................................. 48
4.4.4 定义次序 ........................................................... 49
4.5 节 词法规则 ............................................................... 49
4.5.1 注释 ............................................................... 49
4.5.2 关键字 ............................................................. 49
4.5.3 标识符 ............................................................. 49
4.6 节 基本的 Slice 类型 ....................................................... 50
4.6.1 整数类型 ........................................................... 51
4.6.2 浮点类型 ........................................................... 51
4.6.3 串 ................................................................. 51
4.6.4 布尔值 ............................................................. 52
4.6.5 字节 ............................................................... 52
4.7 节 用户定义的类型 ......................................................... 52
4.7.1 枚举 ............................................................... 52
4.7.2 结构 ............................................................... 52
4.7.3 序列 ............................................................... 53
4.7.4 词典 ............................................................... 54
4.7.5 常量定义与直接量 ................................................... 55
4.8 节 接口、操作,以及异常 ................................................... 58
4.8.1 参数与返回值 ....................................................... 59
4.8.2 用户异常 ........................................................... 62
4.8.3 异常继承 ........................................................... 63
4.8.4 运行时异常 ......................................................... 66
4.8.5 接口语义与代理 ..................................................... 69
4.8.6 接口继承 ........................................................... 71
4.9 节 类 ..................................................................... 78
4.9.1 简单类 ............................................................. 79
4.9.2 类继承 ............................................................. 79
4.9.3 类的继承语义 ....................................................... 80
4.9.4 类用作联合 ......................................................... 82
4.9.5 自引用的类 ......................................................... 83
4.9.6 类 vs.结构 .......................................................... 86
4.9.7 有操作的类 ......................................................... 86
4.9.8 类在架构上的影响 ................................................... 87
4.9.9 实现接口的类 ....................................................... 88
类继承的局限 ................................................... 90
4.9.10
传值 vs. 传引用 ................................................. 91
4.9.11
提前声明 ........................................................... 93
模块 ............................................................... 94
4.10 节
4.11 节
4.19.1
4.19.2
4.20 节
第 5 章
第 6 章
4.17 节
4.18 节
4.19 节
4.16.1
4.16.2
4.16.3
4.16.4
4.12 节
4.13 节
4.14 节
4.15 节
4.16 节
类型 ID ............................................................. 96
Object 上的操作 ..................................................... 97
本地类型 ........................................................... 98
Ice 模块 ............................................................ 99
名字与作用域 ....................................................... 99
名字作用域 ..................................................... 99
大小写敏感性 .................................................. 100
嵌套作用域中的名字 ............................................ 101
名字查找规则 .................................................. 102
元数据 ............................................................ 103
使用 Slice 编译器 .................................................. 104
Slice 与 CORBA IDL 的对比 ........................................... 105
Slice 有、而 CORBA IDL 没有的特性 ............................... 105
CORBA IDL 有、而 Slice 没有的特性 ............................... 106
总结 .............................................................. 111
一个简单文件系统的 Slice 定义 .......................................... 111
5.1 节 本章综述 .............................................................. 111
5.2 节 文件系统应用 .......................................................... 111
5.3 节 文件系统的 Slice 定义 .................................................. 112
5.4 节 完整的定义 ............................................................ 114
客户端的 Slice-to-C++映射 .............................................. 115
6.1 节 本章综述 .............................................................. 115
6.2 节 引言 .................................................................. 115
6.3 节 标识符的映射 .......................................................... 115
6.4 节 模块的映射 ............................................................ 116
6.5 节
Ice 名字空间 ...................................................... 117
6.6 节 简单内建类型的映射 .................................................... 117
6.7 节 用户定义类型的映射 .................................................... 117
6.7.1 枚举的映射 ........................................................ 118
6.7.2 结构的映射 ........................................................ 118
6.7.3 序列的映射 ........................................................ 120
6.7.4 词典的映射 ........................................................ 120
6.8 节 常量的映射 ............................................................ 121
6.9 节 异常的映射 ............................................................ 122
运行时异常的映射 .................................................. 125
6.10 节
6.11 节
接口的映射 ........................................................ 126
代理类和代理句柄 .............................................. 126
代理句柄上的方法 .............................................. 127
对象标识与代理比较 ............................................ 131
操作的映射 ........................................................ 133
普通的、 idempotent,以及 nonmutating 操作 ..................... 134
传递参数 ...................................................... 134
异常处理 .......................................................... 139
类的映射 .......................................................... 141
6.11.1
6.11.2
6.11.3
6.12.1
6.12.2
6.12 节
6.13 节
6.14 节
6.15 节
6.16 节
6.14.1
6.14.2
6.14.3
6.14.4
6.14.5
从 Ice::Object 继承 ............................................ 143
类的数据成员 .................................................. 144
类的操作 ...................................................... 144
类工厂 ........................................................ 145
用于类的智能指针 .............................................. 147
slice2cpp 命令行选项 .............................................. 156
与 CORBA C++映射比较 ............................................... 156
开发 C++文件系统客户 ................................................... 156
7.1 节 本章综述 .............................................................. 156
7.2 节
C++客户 ........................................................... 156
7.3 节 总结 .................................................................. 162
客户端的 Slice-to-Java 映射 ............................................ 162
8.1 节 本章综述 .............................................................. 162
8.2 节 引言 .................................................................. 162
8.3 节 标识符的映射 .......................................................... 163
8.4 节 模块的映射 ............................................................ 163
8.5 节
Ice Package ....................................................... 164
8.6 节 简单内建类型的映射 .................................................... 164
8.7 节 用户定义类型的映射 .................................................... 165
8.7.1 枚举的映射 ........................................................ 165
8.7.2 结构的映射 ........................................................ 167
8.7.3 序列的映射 ........................................................ 168
8.7.4 词典的映射 ........................................................ 169
8.8 节 常量的映射 ............................................................ 169
8.9 节 异常的映射 ............................................................ 170
运行时异常的映射 .................................................. 172
8.10 节
8.11 节
接口的映射 ........................................................ 172
代理接口 ...................................................... 173
Ice.ObjectPrx 接口 ............................................. 174
代理助手 ...................................................... 176
操作的映射 ........................................................ 178
普通的、idempotent,以及 nonmutating 操作 ...................... 178
传递参数 ...................................................... 179
异常处理 .......................................................... 184
类的映射 .......................................................... 186
类工厂 ........................................................ 187
Package ........................................................... 189
slice2java 命令行选项 .............................................. 190
开发 Java 文件系统客户 ................................................. 191
9.1 节 本章综述 .............................................................. 191
9.2 节
Java 客户 .......................................................... 191
9.3 节 总结 .................................................................. 196
服务器端的 Slice-to-C++映射 ............................................ 196
本章综述 .......................................................... 196
8.13 节
8.14 节
8.11.1
8.11.2
8.11.3
8.12.1
8.12.2
8.14.1
8.15 节
8.16 节
8.12 节
第 7 章
第 8 章
第 9 章
第 10 章
10.1 节
10.2 节
10.3 节
10.4 节
10.3.1
10.3.2
10.4.1
10.4.2
10.5 节
10.6 节
10.7 节
10.7.1
10.7.2
10.7.3
10.7.4
10.7.5
11.2.1
11.2.2
11.2.3
10.8 节
第 11 章
11.1 节
11.2 节
11.3 节
第 12 章
12.1 节
12.2 节
12.3 节
引言 .............................................................. 196
服务器端 main 函数 ................................................. 196
Ice::Application 类 ............................................ 198
Ice::Service 类 ................................................ 202
接口的映射 ........................................................ 208
骨架类 ........................................................ 208
Servant 类 ..................................................... 209
参数传递 .......................................................... 210
引发异常 .......................................................... 211
对象体现 .......................................................... 212
实例化 Servant ................................................. 212
创建标识 ...................................................... 213
激活 Servant .................................................. 213
用 UUID 做标识 ................................................. 214
创建代理 ...................................................... 215
总结 .............................................................. 216
开发 C++文件系统服务器 ................................................. 216
本章综述 .......................................................... 216
实现文件系统服务器 ................................................ 216
服务器的 main 程序 ............................................. 217
Servant 类定义 ................................................. 223
Servant 实现 .................................................. 227
总结 .............................................................. 231
服务器端的 Slice-to-Java 映射 .......................................... 232
Chapter Overview .................................................. 232
引言 .............................................................. 232
服务器端 main 函数 ................................................. 232
Ice.Application 类 ............................................. 233
接口的映射 ........................................................ 236
骨架类 ........................................................ 236
Servant 类 ..................................................... 237
参数传递 .......................................................... 238
引发异常 .......................................................... 239
Tie 类 ............................................................. 240
对象体现 .......................................................... 244
Instantiating a Servant ....................................... 244
创建标识 ...................................................... 244
激活 Servant .................................................. 245
用 UUID 做标识 ................................................. 245
创建代理 ...................................................... 246
总结 .............................................................. 247
开发 Java 文件系统服务器 ............................................... 247
本章综述 .......................................................... 247
实现文件系统服务器 ................................................ 247
12.4 节
12.3.1
12.4.1
12.4.2
12.5 节
12.6 节
12.7 节
12.8 节
12.8.1
12.8.2
12.8.3
12.8.4
12.8.5
12.9 节
第 13 章
13.1 节
13.2 节
13.3 节
第 14 章
14.1 节
14.2 节
14.3 节
14.4 节
14.5 节
14.6 节
14.7 节
14.8 节
14.9 节
第 15 章
15.1 节
15.2 节
15.3 节
15.4 节
15.5 节
13.2.1
13.2.2
13.2.3
14.2.1
14.2.2
14.2.3
14.2.4
14.8.1
14.8.2
14.8.3
14.8.4
14.8.5
服务器的 main 程序 ............................................. 248
FileI Servant 类 ............................................... 251
DirectoryI Servant 类 .......................................... 253
总结 .............................................................. 255
Ice 属性与配置 ......................................................... 255
本章综述 .......................................................... 255
属性 .............................................................. 255
属性范畴 ...................................................... 255
保留的前缀 .................................................... 256
属性语法 ...................................................... 256
值语法 ........................................................ 256
配置文件 .......................................................... 256
在命令行上设置属性 ................................................ 257
Ice.Config 属性 .................................................... 258
命令行解析与初始化 ................................................ 258
Ice.ProgramName 属性 ............................................... 260
在程序中使用属性 .................................................. 260
读取属性 ...................................................... 261
设置属性 ...................................................... 262
解析属性 ...................................................... 263
实用操作 ...................................................... 265
处理多个属性集 ................................................ 265
总结 .............................................................. 268
C++ 线程与并发 ........................................................ 269
本章综述 .......................................................... 269
引言 .............................................................. 269
Ice 线程模型 ...................................................... 269
线程库综述 ........................................................ 269
互斥体 ............................................................ 270
文件系统应用的线程安全的文件访问 .............................. 271
保证互斥体的解锁 .............................................. 272
递归互斥体 ........................................................ 274
读写递归互斥体 .................................................... 276
定时锁 ............................................................ 279
监控器 ............................................................ 282
Monitor 类 ..................................................... 282
使用监控器 .................................................... 284
高效通知 ...................................................... 286
效率考虑事项 .................................................. 289
线程 .............................................................. 290
Thread 类 ...................................................... 290
实现线程 ...................................................... 291
创建线程 ...................................................... 292
ThreadControl 类 ............................................... 292
15.5.1
15.5.2
15.6 节
15.7 节
15.8 节
15.9 节
15.10 节
15.9.1
15.9.2
15.9.3
15.9.4
15.10.1
15.10.2
15.10.3
15.10.4
16.1 节
16.2 节
16.3 节
16.3.1
16.3.2
16.3.3
16.3.4
16.3.5
16.4 节
16.5 节
16.6 节
15.10.5
15.10.6
15.11 节
一个小例子 .................................................... 294
可移植的信号处理 .............................................. 295
总结 .............................................................. 296
第三部分 高级 Ice .................................................................. 296
Ice Run Time 详解 ..................................................... 297
第 16 章
引言 .............................................................. 297
通信器 ............................................................ 297
对象适配器 ........................................................ 300
活动 Servant 映射表 ............................................ 300
Servant ....................................................... 301
对象适配器接口 ................................................ 301
Servant 激活与解除激活 ........................................ 302
适配器状态 .................................................... 303
对象标识 .......................................................... 305
Ice::Current 对象 .................................................. 306
Servant 定位器 ..................................................... 307
综述 .......................................................... 307
Servant 定位器接口 ............................................. 308
针对 Servant 定位器的线程保证 .................................. 309
Servant 定位器注册 ............................................. 310
实现一个简单的 Servant 定位器 .................................. 311
使用对象标识的 category 成员 ................................... 315
使用 Cookies ................................................... 317
服务器实现技术 .................................................... 318
渐进的初始化 .................................................. 318
缺省 Servants ................................................. 322
混合途径及缓存 ................................................ 324
Servant 逐出器 ................................................ 324
Ice::Context ...................................................... 337
显式传递上下文 ................................................ 337
隐式传递上下文 ................................................ 338
取回隐式的上下文 .............................................. 339
上下文用例 .................................................... 340
警告 .......................................................... 340
调用超时 .......................................................... 341
单向调用 .......................................................... 342
数据报调用 ........................................................ 345
成批的调用 ........................................................ 347
测试代理的分派类型 ................................................ 348
Ice::Logger 接口 ................................................... 348
Ice::Stats ........................................................ 349
位置透明性 ........................................................ 350
16.17 对比 Ice 与 CORBA Run Time ................................... 351
总结 .............................................................. 352
16.9 节
16.10 节
16.11 节
16.12 节
16.13 节
16.14 节
16.15 节
16.16 节
16.17 节
16.18 节
16.8.1
16.8.2
16.8.3
16.8.4
16.8.5
16.6.1
16.6.2
16.6.3
16.6.4
16.6.5
16.6.6
16.6.7
16.7.1
16.7.2
16.7.3
16.7.4
16.7 节
16.8 节