CORBA 技 术 和Java 技 术 的 结 合 —— Java I D L

来源:互联网 发布:单片机原理与接口技术 编辑:程序博客网 时间:2024/06/04 18:28
CORBA 技 术 和Java 技 术 的 结 合 Java I D L  
来自:Java技术及其应用(第二版),22章1节
出版时间:2007-1
作者:王克宏 主编,董丽,王少锋,赵仪 编著   
 
一、 什 么 是Java IDL ----Java IDL(Interface Definition Language) 可 实 现 网 络 上 不 同 平 台 上 的 对 象 相 互 之 间 的 交 互, 该 技 术 基 于 通 用 对 象 请 求 代 理 体 系 结 构CORBA 规 范 说 明。IDL 是 不 依 赖 于 语 言 的 接 口 定 义 语 言, 所 有 支 持CORBA 的 语 言 都 有IDL 到 该 语 言 的 映 射。 就 像 其 名 字 所 表 示 的 那 样,Java IDL 支 持 到Java 语 言 的 映 射。CORBA 规 范 说 明 和IDL 映 射 是 由OMG(Object Management Group) 定 义 的。OMG 由700 多 个 成 员 组 成,Sun 公 司 是 其 成 员 之 一, 它 在 定 义IDL 到Java 映 射 的 工 作 中 起 了 主 要 作 用。  ----JDK 1.1 给Java 开 发 人 员 提 供 了 开 发100 % 纯Java 分 布 式 应 用 的 功 能, 即 远 程 方 法 调 用Java RMI。 而Java 2 平 台 提 供 的Java IDL 可 以 在 分 布 式 应 用 中 使 用 非Java 语 言, 也 就 是 说,Java 2 平 台 提 供 的ORB(Object Request Broker) 可 以 和 任 何 遵 从CORBA 规 范 的ORB 互 操 作, 包 括IONA Technologies 的Orbix、Visigenic Software 的 VisiBroker、 IBM 的 Component Broker 等。 目 前, 主 要 的Web 浏 览 器(Microsoft IE 4.0 和 Netscape Navigator 4.0) 实 现 的 主 要 是JDK 1.1 中 的 功 能。 不 过, 利 用Sun 公 司 提 供 的Java 插 件(Plug -in) 可 以 使 浏 览 器 具 备Java 2 平 台 的 所 有 特 征。  
----需 要 说 明 的 是,Java 2 平 台 提 供 了 两 种 不 同 的 方 法 来 构 造 分 布 式 应 用 系 统, 即Java RMI 和Java IDL, 它 们 具 有 相 似 的 特 征 和 功 能,Java RMI 支 持 用Java 语 言 写 的 分 布 式 对 象, Java IDL 可 以 与 支 持CORBA 的 任 何 程 序 设 计 语 言 如C、C + +、 COBOL 等 写 的 分 布 式 对 象 交 互。 这 两 种 方 法 各 自 具 有 不 同 的 特 点:  
----(1)100 % 纯Java 和 对 遗 产 应 用 系 统(legacy system) 的 支 持。Java RMI 是 对 分 布 式 应 用 系 统 的100 % 纯Java 解 决 方 法, 具 有Java 的“Write once, run anywhere” 的 优 点。 用Java RMI 开 发 的 应 用 系 统 可 以 部 署 在 任 何 支 持Java 运 行 环 境 的 平 台 上。  
---- 相 反,Java IDL 是 基 于CORBA 规 范 标 准 的 技 术, 可 以 远 程 调 用 非Java 语 言 编 写 的 对 象, 因 此Java IDL 提 供 了 对 那 些 用 非Java 语 言 开 发 的 遗 产 应 用 系 统 的 支 持。  
----(2) 使 用 不 同 的 通 信 协 议。Java RMI 和 Java IDL 目 前 使 用 不 同 的 通 信 协 议,Java IDL 使 用CORBA/IIOP 协 议,IIOP (Internet Inter -ORB Protocol) 协 议 可 以 使 位 于 不 同 平 台 上、 用 不 同 语 言 写 的 对 象 以 标 准 的 方 式 进 行 通 信;Java RMI 目 前 使 用Java 远 程 消 息 交 换 协 议JRMP(Java Remote Messaging Protocol) 进 行 通 信,JRMP 是 专 为Java 的 远 程 对 象 制 定 的 协 议, 不 过Sun 和IBM 已 经 宣 布 将 来 会 支 持 在RMI 中 使 用IIOP 协 议, 以 便 和 遵 从CORBA 规 范 的 远 程 对 象 通 信。  ----(3) 通 过 引 用 调 用 对 象 还 是 通 过 值 调 用 对 象。 在Java IDL 中, 客 户 端 通 过 引 用 与 远 程 对 象 交 互, 即 客 户 机 使 用 桩(Stub) 对 远 程 服 务 器 上 的 对 象 进 行 操 作, 但 并 不 拷 贝 服 务 器 上 的 对 象。  
---- 相 反,RMI 使 得 客 户 机 可 以 通 过 引 用 和 远 程 对 象 交 互, 也 可 以 把 远 程 对 象 下 载 到 客 户 机 运 行 环 境 进 行 操 作, 由 于 在RMI 中 使 用 的 对 象 都 是Java 对 象, 因 此RMI 使 用Java 中 的 对 象 串 行 化(Serialization) 功 能 在 服 务 器 和 客 户 机 之 间 传 输 对 象。 不 过CORBA 规 范 的 以 后 版 本 将 包 括 按 值 调 用 对 象 的 功 能。  
----Java RMI 和Java IDL 各 有 自 己 的 优 缺 点, 从 某 种 意 义 上 说,RMI 可 以 看 作 是RPC (Remote Procedure Calls) 的 面 向 对 象 版 本。RMI 的 最 大 优 势 是 可 以 用 它 来 提 供100 % 纯Java 的 解 决 方 案, 这 意 味 着 构 造RMI 应 用 系 统 将 比 较 简 单, 但 这 也 正 是 基 于RMI 的 应 用 系 统 的 一 个 缺 点, 即 只 能 在Java 环 境 中 运 行, 不 能 充 分 利 用 遗 产 应 用 系 统。  
----Java RMI 和 Java IDL 均 可 满 足 一 定 范 围 的 用 户 需 求, 都 适 用 于 一 定 范 围 的 应 用, 两 者 之 间 存 在 着 重 叠, 有 些 应 用 可 使 用 两 者 中 的 任 何 一 种 技 术 开 发, 但 对 于 某 些 应 用 来 说, 采 用 其 中 的 某 一 种 比 采 用 另 一 种 更 为 恰 当。  二、 使 用CORBA 和Java IDL ----从1989 年 以 来,OMG 一 直 致 力 于 开 放 的 软 件 总 线 体 系 结 构CORBA 的 规 范 说 明 的 定 义, 利 用CORBA, 不 同 供 应 商 开 发 的、 运 行 在 不 同 平 台 上 的 构 件 可 以 互 操 作, 而 不 管 该 对 象 位 于 何 处, 用 什 么 语 言 实 现。Java IDL 使 得Java 也 支 持CORBA 规 范 说 明。 作 为Java 企 业 计 算API 的 一 部 分,Java IDL 可 以 保 证 企 业 异 质 计 算 中 的 无 缝 互 操 作 性 和 可 连 接 性。  
----CORBA 对 象 和 一 般 的 程 序 设 计 语 言 中 的 对 象 的 区 别 在 于:  CORBA 对 象 可 以 位 于 网 络 中 的 任 何 位 置;  CORBA 对 象 可 以 和 其 他 平 台 上 的 对 象 交 互;  
CORBA 对 象 可 以 用 任 何 程 序 设 计 语 言 编 写, 只 要 有IDL 到 该 语 言 的 映 射 即 可( 目 前 已 包 括 到Java、C + +、C、Smalltalk、COBOL、 Ada 等 语 言 的 映 射)。 
---- 接 口 定 义 语 言IDL 用 于 定 义CORBA 对 象 的 接 口, 所 有 的CORBA 对 象 都 支 持IDL 接 口。IDL 语 法 和C + + 非 常 类 似, 利 用Java IDL, 可 以 在Java 中 定 义、 实 现、 存 取CORBA 对 象。 对 于 每 个IDL,idltojava 生 成 一 个Java 接 口 和 其 他 一 些 必 要 的.java 文 件, 包 括 一 个 客 户 端 桩(Stub) 和 服 务 器 端 骨 架(Skeleton)。  ---- 为 了 使 用Java IDL, 需 要 有idltojava 编 译 器, idltojava 产 生 和 任 何 遵 从CORBA 规 范 的ORB 一 起 工 作 的 客 户 端 桩 和 服 务 器 端 骨 架,Java 2 平 台 中 包 括CORBA API 和ORB, 使 得Java 应 用 系 统 通 过IIOP 协 议 可 以 调 用 远 程 的CORBA 对 象,Java ORB 支 持 暂 态(Transient)CORBA 对 象, 提 供 了 暂 态 名 字 服 务 器 把 对 象 组 织 成 树 目 录 结 构, 名 字 服 务 器 遵 从CORBA 中COS 规 范 说 明 的 命 名 服 务 规 范 说 明(Naming Service Specification)。  
 
---- 图1 说 明 了 从 客 户 端 到 服 务 器 发 送 一 个 消 息 请 求 的 过 程, 其 中 客 户 端 也 可 以 是 一 个CORBA 对 象:  
---- 客 户 机 不 需 要 了 解CORBA 对 象 的 位 置 与 实 现 细 节, 也 不 需 要 了 解 哪 个ORB 用 于 存 取 对 象。  
---- 在 客 户 端, 应 用 系 统 包 括 远 程 对 象 的 引 用, 对 象 引 用 使 用 桩 方 法 作 为 远 程 方 法 的 代 理, 这 个 方 法 事 实 上 在ORB 中 的, 所 以 调 用 桩 方 法 会 调 用ORB 的 连 接 功 能,ORB 会 把 对 桩 方 法 的 调 用 传 递 到 服 务 器 端。  
---- 在 服 务 器 端,ORB 利 用 骨 架 代 码 把 远 程 调 用 转 换 成 本 地 对 象 的 方 法 调 用, 骨 架 需 要 对 调 用 和 参 数 的 格 式 进 行 转 换。 同 时, 当 方 法 返 回 时, 骨 架 对 结 果 进 行 变 换, 然 后 通 过ORB 把 结 果 返 回 给 客 户 机。  
---- 不 同 的ORB 之 间 通 过IIOP 协 议 进 行 通 信, IIOP 是 建 立 在TCP/IP 之 上 的 协 议。  
----CORBA 目 前 还 处 于 发 展 阶 段, 一 些 标 准 还 在 定 义 之 中, 但CORBA 中 的 大 部 分 基 本 结 构 已 经 定 义, 许 多 软 件 供 应 商 已 根 据CORBA 的 定 义 作 了 很 多 开 发 工 作,Java IDL 就 是 该 规 范 说 明 的 一 个 实 现。 但 在Java 2 平 台 中, 并 没 有 实 现CORBA 规 范 说 明 中 的 所 有 特 征, 如:  接 口 库: 在 一 般 的Java IDL 操 作 中 并 不 需 要 接 口 库,Java 客 户 机 可 以 存 取 其 他 的 接 口 库, 如C + + ORB 提 供 的 接 口 库;  RMI/IIOP 协 议;  按 值 调 用 对 象;  
IDL 中 的 一 些 类 型 如wchar、wstring、long double 等。 三、 IDL 到Java 的 映 射 
---- 为 了 使Java 支 持CORBA 规 范 说 明, 需 要 一 个 把IDL 中 的 元 素 映 射 为Java 中 元 素 的 标 准 途 径,Sun 已 经 制 订 了 两 者 之 间 的 映 射 规 则, 并 提 供 了 编 译 器idltojava, 以 便 从IDL 得 到 相 应 的 桩 和 骨 架。  ---- 下 表 列 出 了 一 些IDL 中 元 素 和Java 中 元 素 的 映 射 关 系。
---- 和Java 中 的 接 口 一 样,IDL 接 口 不 包 含 方 法 的 具 体 实 现,Java 开 发 人 员 需 在Java 类 中 提 供 对 这 些 方 法 的 具 体 实 现。  四、 使 用Java IDL 开 发 应 用 的 过 程 及 实 例 
----用Java IDL 开 发 分 布 式 应 用 系 统 一 般 可 分 为 五 个 步 骤:  ----1. 定 义 远 程 接 口  
---- 用IDL 定 义 远 程 对 象 的 接 口, 使 用IDL 而 不 是Java 语 言 是 因 为idltojava 编 译 器 可 以 自 动 地 从IDL 产 生Java 语 言 的 桩 和 骨 架 源 文 件, 以 及 和ORB 连 接 时 所 需 要 的 一 些 代 码。 使 用 IDL, 开 发 人 员 可 以 用 其 他 语 言 来 实 现 客 户 机 和 服 务 器。 如 果 要 为 一 个 已 经 存 在 的CORBA 服 务 实 现 客 户 机, 或 为 一 个 已 经 存 在 的 客 户 机 实 现 服 务, 则 首 先 要 给 出IDL 接 口, 然 后 运 行idltojava 编 译 器 产 生 桩 和 骨 架, 在 此 基 础 上 再 进 行 实 现。  ----2. 编 译 远 程 接 口  
---- 在IDL 文 件 运 行idltojava 编 译 器, 产 生Java 版 本 的 接 口, 以 及 桩 和 骨 架 代 码 文 件, 这 些 代 码 文 件 使 得 应 用 程 序 可 以 和ORB 相 连 接。  ----3. 实 现 服 务 器  
---- 把idltojava 编 译 器 产 生 的 骨 架 和 服 务 器 应 用 程 序 集 成 在 一 起, 除 了 要 实 现 远 程 接 口 中 的 方 法 之 外, 服 务 器 代 码 还 要 包 括 启 动ORB 以 及 等 待 远 程 客 户 机 的 调 用 等 部 分。  ----4. 实 现 客 户 机  
---- 类 似 地, 以 桩 作 为 客 户 端 应 用 程 序 的 基 础, 客 户 机 建 立 在 桩 之 上, 通 过Java IDL 提 供 的 名 字 服 务 查 询 服 务 器, 获 得 远 程 对 象 的 引 用, 然 后 调 用 远 程 对 象 中 的 方 法。  ----5. 启 动 应 用 程 序  
---- 一 旦 实 现 了 服 务 器 和 客 户 机, 就 可 以 启 动 名 字 服 务, 接 着 启 动 服 务 器, 然 后 运 行 客 户 机。  
---- 下 面 以 一 个 经 典 的Hello World 程 序 来 说 明 具 体 的 开 发 过 程。Hello World 包 含 一 个 操 作, 该 操 作 返 回 一 个 字 符 串 并 打 印 出 来,Client 和
Server 之 间 的 通 信 过 程 如 下:  
----(1)客 户 端 应 用 程 序 或 小 应 用 程 序 调 用 HelloServer 的sayHello 操 作;  ----(2) ORB 把 调 用 传 递 到 已 注 册 的 服 务 对 象;  
----(3) 服 务 对 象 运 行sayHello 方 法, 返 回 一 个 Java 字 符 串;  ----(4) ORB 把 该 字 符 串 返 回 给 客 户 机;  ----(5) 客 户 机 打 印 该 字 符 串 的 值。  
---- 尽 管Hello World 程 序 比 较 简 单, 但 它 涉 及 到 的 任 务 和 几 乎 任 何 一 个 使 用CORBA 静 态 调 用 的 分 布 式 应 用 系 统 所 涉 及 到 任 务 相 同, 图2 说 明 了 如 何 用CORBA 在 客 户 机 和 服 务 器 之 间 实 现 经 典 的“Hello World” 程 序。
首 先 是 定 义Hello.idl, 下 面 是 用IDL 描 述 的 Hello.idl, 只 有 一 个 操 作( 方 法), 该 操 作 返 回 一 个 字 符 串。  module HelloApp { 
    interface Hello     { 
       string sayHello();     }; }; 
---- 然 后 把 Hello.idl 文 件 映 射 为Java 源 代 码 文 件, 用 以 下 命 令 编 译Hello.idl 文 件:  ----idltojava Hello.idl  
---- 根 据 命 令 行 中 的 不 同 选 项,idltojava 编 译 器 产 生 不 同 的 文 件, 上 面 这 条 命 令 将 创 建 子 目 录HelloApp 并 在 其 中 产 生 五 个 文 件:_HelloImplBase.java、_HelloStub.java、Hello.java、 HelloHelper.java、HelloHolder.java。  ---- 要 完 成 该 应 用 程 序, 还 要 分 别 在 这 五 个 文 件 的 基 础 上 提 供 服 务 器 端 和 客 户 机 端 的 实 现。  
----CORBA 服 务 器 程 序 的 结 构 和 大 部 分Java 应 用 程 序 的 结 构 一 样, 即 导 入 所 需 要 的 包, 声 明 服 务 器 类, 定 义 main 方 法, 处 理 一 些 例 外 等。 另 外,CORBA 服 务 器 要 有 一 个ORB 对 象, 每 个 服 务 器 实 例 化 一 个ORB, 并 向 其 注 册 服 务 对 象, 因 此 当 ORB 接 收 到 调 用 请 求 时 可 以 寻 找 到 服 务 器。 最 后 是 服 务 对 象 的 管 理, 服 务 器 是 一 个 进 程, 实 例 化 了 一 个 或 多 个 服 务 对 象, 服 务 对 象 具 体 实 现 接 口 中 说 明 的 操 作。HelloServer 和 命 名 服 务 一 起 工 作, 使 得 服 务 对 象 对 于 客 户
机 来 说 是 可 用 的, 服 务 器 需 要 对 名 字 服 务 的 对 象 引 用, 可 以 向 名 字 服 务 注 册, 并 保 证 向Hello 接 口 的 调 用 被 路 由 到 其 服 务 对 象 上, 最 后 是 等 待 客 户 机 的 调 用。  
----CORBA 客 户 机 的 结 构 和 大 部 分Java 应 用 程 序 的 结 构 基 本 相 似, 即 导 入 所 需 要 的 包、 声 明 应 用 类、 定 义 main 方 法、 处 理 一 些 例 外 等。 另 外 和 服 务 器 程 序 一 样, 一 个CORBA 客 户 机 也 需 要 本 地 的ORB 来 执 行 所 有 的 配 置 工 作, 每 个 客 户 机 实 例 化 一 个org.omg.CORBA.ORB 对 象, 然 后 向 该 对 象 传 递 一 些 必 要 的 信 息 以 进 行 初 始 化, 最 后 是 利 用ORB 取 得 所 需 要 的 服 务。 一 旦 一 个 应 用 有 了ORB, 即 可 通 过ORB 来 确 定 应 用 所 需 要 的 服 务 的 位 置, 在 本 例 子 中 即 是Hello server。 为 了 调 用CORBA 对 象 中 的 操 作, 客 户 端 应 用 要 有 对 该 对 象 的 引 用, 有 很 多 种 方 法 可 以 得 到 这 种 引 用, 如 调 用ORB.resolve_initial_references 或 使 用 其 他 的CORBA 对 象( 如 命 名 服 务), 当 在 分 布 式 环 境 中 没 有 命 名 服 务 可 用 时,CORBA 客 户 机 使 用 字 符 串 化 对 象 引 用(Stringified object reference) 来 得 到 其 第 一 个 对 象。 

书的链接:http://book.kongfz.com/154859/302247255/