服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

corba与java的结合使用


  学习使用corba编写访问服务器对象的分布式java小应用
沈加翔 编译


--------------------------------------------------------------------------------

摘 要: 若 想 实 现web 上 分 布 式 客 户 机/ 服 务 器 模 式 的 应 用 程 序, 可 以 选 择 多 种 不 同 的 技 术。 但 是, 对 于 必 须 服 务 于 大 量 用 户 的 应 用, 我 们 认 为 应 该 首 选corba, 因 为 它 具 有 可 扩 展 性 和 业 界 广 泛 的 支 持。 由 于corba 的 强 健 性 可 以 提 高java 编 程 语 言 的 性 能, 利 用 已 有 的 基 于 标 准 的 技 术,java 开 发 者 可 以 编 写 出 功 能 强 大 的web 应 用 程 序。 在 这 篇 文 章 里, 我 们 首 先 简 单 介 绍 一 下corba, 然 后 作 为 该 技 术 的 实 例, 我 们 将 着 手 编 写 一 个n 层 客 户 机/ 服 务 器 应 用 程 序。 另 外, 在 附 文 中, 我 们 对 几 种 分 布 式 对 象 技 术 作 了 一 个 比 较, 它 们 分 别 是corba、rmi 和dcom。

利 用html 表 和 通 用 网 关 接 口(common gateway interface), 用 户 可 以 对web 网 点 上 的 服 务 器 脚 本 进 行 交 互 式 的 访 问。 许 多 网 点 上 使 用 这 种 技 术 提 示 用 户 输 入 用 户 名 和 密 码。 这 些 东 西 传 入 服 务 器 脚 本 之 后, 用 于 验 证 该 用 户 是 否 可 以 访 问 网 点 中 的 某 一 部 分 内 容。 这 一 过 程 用 到 了http, 而 它 是 一 种 无 状 态(stateless) 的 协 议。 每 次 下 载 一 个 页 面, 客 户 机 就 与 服 务 器 完 全 脱 离, 服 务 器 方 无 从 得 知 客 户 机 的 信 息, 更 无 法 知 道 脱 离 后 的 客 户 机 正 在 进 行 的 动 作。 这 样, 哪 怕 是 在 成 功 的 登 录 到 某 一 网 点 之 后, 客 户 程 序 每 查 询 一 个 页 面, 仍 需 将 用 户 名 和 密 码 传 向 服 务 器 方 进 行 重 复 的 认 证。 换 句 话 说, 在 你 的 客 户 应 用 程 序(web 浏 览 器) 和 服 务 器 应 用 程 序 之 间, 不 存 在 局 部 变 量、 方 法 调 用 或 是 对 象。

经 过 数 十 年 的 努 力, 软 件 开 发 者 们 几 乎 可 以 成 功 地 将 代 码 以 对 象 的 形 式 加 以 封 装。 但 是, 上 面 提 到 的 现 象, 无 疑 表 明 了 我 们 正 在 倒 退, 因 为 那 是 无 状 态 的、 批 处 理 的 计 算 模 式。

当 然,cgi 技 术 并 非 一 无 是 处。web 给 我 们 带 来 了 革 命 性 的 优 势, 那 就 是 基 于 标 准 的 开 放 协 议 和 与 平 台 无 关 的 独 立 性。 尽 管 成 千 上 万 的web 网 点 使 用http 和cgi 来 获 得 用 户 信 息、 在 服 务 器 上 运 行 一 段 脚 本、 甚 至 还 可 能 向 用 户 返 回 信 息, 但 是 从 传 统 的 的 观 点 看 来, 这 些 网 点 并 不 能 算 是 真 正 的“ 应 用 程 序”。 除 此 之 外, 由 于 新 技 术 的 应 用(http 和cgi), 所 有 这 些 网 点 的 代 码 必 须 要 全 部 重 写。 想 要 对 已 有 的web 软 件 资 源 加 以 利 用, 或 是 编 写 真 正 功 能 强 大 的 应 用 程 序, 使internet/intranet 成 为 通 信 主 干, 所 使 用 的 技 术 必 须 具 有 以 下 特 性:

支 持 现 有 的c、c + + 和cobol 代 码

支 持java, 以 建 立 具 有 可 移 值 性、 平 台 独 立 性 的 面 向 对 象 的 应 用 程 序

商 业 中 立 性, 只 有 这 样, 应 用 程 序 才 易 于 维 护, 且 不 会 被 时 间 淘 汰。

可 扩 充 性, 能 够 支 持 大 量 用 户

它 应 该 被 多 种 平 台 所 支 持, 而 不 是 固 定 于 某 种 平 台 之 上。

开 发 模 型 应 该 是 面 向 对 象 的( 因 为oop 有 许 多 固 有 优 势)

端 到 端 的 安 全 性

广 泛 的 业 界 支 持
corba 入 门
通 读 本 文 之 后, 你 会 发 现 只 有 一 种 技 术, 那 就 是corba 才 具 有 上 述 特 性( 其 优 势 不 止 于 此)。 另 外, 由 于java 和corba 是 互 补 的 两 项 技 术, 你 可 以 迅 速 的 学 会 用java 进 行corba 的 开 发。

corba 简 介
corba 是 一 种 规 范, 它 定 义 了 分 布 式 对 象 如 何 实 现 互 操 作。 在world wide web 盛 行 之 前, 特 别 是java 编 程 语 言 风 靡 之 前,c + + 开 发 者 基 本 将corba 作 为 其 高 端 分 布 式 对 象 的 解 决 方 案。

实 际 的corba 规 范 归 对 象 管 理 组(objeot management group) 管 辖, 这 是 一 家 由700 多 家 公 司 组 成 的 开 放 的 研 讨 会, 其 工 作 是 制 订 对 象 计 算 的 开 放 标 准。corba 对 象 可 以 用 任 何 一 种corba 软 件 开 发 商 所 支 持 的 语 言, 如c、c++、java、ada 和small talk, 来 编 写。 同 样 地,corba 对 象 可 以 运 行 在 任 何 一 种corba 软 件 开 发 商 所 支 持 的 平 台 上, 如solaris,windows 95/nt,open vms、digital unix、hp-ux 或aix 等。 这 意 味 着, 我 们 可 以 在windows 95 下 运 行java 应 用 程 序, 同 时 动 态 调 入 并 使 用c + + 对 象, 而 实 际 上, 该 对 象 可 能 存 储 于 一 个 在internet 上 的unix web 服 务 器 上。

使 用 接 口 描 述 语 言(interface description language) 编 写 的 对 象 接 口, 使 得 与 语 言 无 关 的 独 立 性 成 为 可 能。idl 使 得 所 有corba 对 象 以 一 种 方 式 被 描 述, 仅 仅 需 要 一 个 由 本 地 语 言(c/c++、corba、java) 到idl 的“ 桥 梁”。corba 对 象 的 互 通 信 要 以 对 象 请 求 解 析 器(object request broker) 为 中 介, 这 种 互 通 可 以 在 多 种 流 行 通 信 协 议 之 上( 如tcp/ip 或 是ipx/spx) 实 现。 在tcp/ip 上, 来 自 于 不 同 开 发 商 的orb 用internet inter-orb 协 议(iiop) 进 行 通 讯, 这 是corba 2.0 标 准( 最 新 的 版 本) 的 一 部 分。

目 前, 对 于 较 为 流 行 的 编 程 语 言( 包 括c + +,smalltalk,java 和ada 95), 已 经 有 了 许 多 第 三 方 的orb。 随 着 其 他 语 言 的 逐 渐 流 行,corba 开 发 商 毫 无 疑 问 地 要 做 出 相 应 的orb 来 支 持 它 们。

最 初,omg 在1990 年 制 订 了 对 象 管 理 体 系(object management architecture), 即oma, 来 描 述 应 用 程 序 如 何 实 现 互 操 作。 作 为 其 中 的 一 部 分, 需 要 有 一 个 标 准 规 范 应 用 程 序 片 段 即 对 象 的 互 操 作 ─ ─ 这 导 致 了corba 的 诞 生。oma 定 义 了 组 成corba 的 四 个 主 要 部 分。

object request broker, 作 为 对 象 互 通 讯 的 软 总 线。

corbaservices, 定 义 加 入orb 的 系 统 级 服 务, 如 安 全 性, 命 名 和 事 务 处 理。

corbafacilities 定 义 应 用 程 序 级 服 务, 如 复 合 文 档 等。

business objects 定 义 现 实 世 界 的 对 象 和 应 用, 如 飞 机 或 银 行 帐 户。
用java 做corba 开 发
为 了 创 建 一 个 分 布 式 的java 小 应 用, 并 让 它 用corba 访 问 服 务 器 对 象, 我 们 利 用 一 个 流 行 的 商 用orb, 并 用idl 定 义 对 象 接 口。 在 示 例 小 应 用 中, 我 选 用 了visigenic visi broker for java。 这 种orb 已 经 经 过oracle、netscape 和novell 等 公 司 的 认 证, 并 已 被 纳 入netscape navigator 4.0。

注 意: 你 可 以 在 非netscape navigator 4.0 的 浏 览 器 中 运 行 这 个 小 应 用。 由 于 它 首 先 要 从 别 处 下 载 一 些java 类 文 件, 启 动 速 度 可 能 会 稍 慢 一 些。

我 们 将 用 一 个 简 单 的java 小 应 用 调 用 一 个 使 用corba 的 服 务 器 对 象。 为 简 单 起 见, 同 样 用java 书 写 服 务 器 对 象。 该 服 务 器 对 象 用 一 个 数 组 存 储 有 关 各 种corba orb 开 发 商 及 他 们 产 品 的 信 息。 客 户 小 应 用 将 调 用 该 对 象 并 查 询 数 组。 一 个 更 为 完 整 的 例 子( 我 推 荐 你 仔 细 思 考 一 下) 是 将orb 信 息 存 储 于 关 系 数 据 库 中, 利 用jdbc( 或 是 别 的 数 据 库 访 问 方 法) 获 得 相 关 信 息。 这 种 方 法 将 用corba 生 成 一 个 真 正 的 三 层 应 用 程 序。

在 开 始 这 个 例 子 之 前, 我 们 要 先 介 绍 一 下 定 义 对 象 接 口 的idl 和orb 的 技 术 细 节。

object request broker 详 述
oma 最 重 要 的 部 分 就 是orb。 为 了 创 建 一 个 遵 从corba 规 范 的 应 用 程 序,orb 是corba 四 大 部 分 中 唯 一 必 须 提 供 的。 许 多orb 版 本 根 本 不 带corbaservices 或 是corbafacilities, 你 可 以 自 制( 或 购 买) 商 用 对 象。 但 是, 没 有orb,corba 应 用 程 序 决 对 无 法 工 作。

corba orb 最 显 见 的 功 能, 是 对 你 的 应 用 程 序 或 是 其 它orb 的 请 求 予 以 响 应。 在corba 应 用 程 序 运 行 期 间, 你 的orb 可 能 被 请 求 做 许 多 不 同 的 事 情, 包 括:

查 找 并 调 用 远 程 计 算 机 上 的 对 象

负 责 不 同 编 程 语 言 之 间 的 参 数 转 换( 如c + + 到java)

可 超 越 本 机 界 限 的 安 全 管 理

为 其 它 的orb 收 集 并 发 布 本 地 对 象 的metadata

用 下 载 的 代 码(stub) 中 描 述 的 静 态 方 法 调 用 去 击 活 远 程 对 象 中 的 方 法

用 动 态 方 法 调 用 击 活 远 程 对 象

自 动 击 活 一 个 当 前 没 有 装 入 内 存 运 行 的 对 象。

将 回 调 方 法 导 引 向 其 管 理 之 下 的 本 地 对 象
实 现 细 节 对 软 件 开 发 者 的 透 明 性, 是orb 的 一 个 杰 出 的 特 性。 用 户 只 须 在 代 码 中 提 供 相 应 的hooks, 用 于 初 始 化orb 并 向orb 登 记 该 应 用 程 序, 就 可 以 将 该 应 用 程 序 和 大 量 分 布 式 对 象 建 立 联 系。

用idl 描 述 对 象
为 了 保 持corba 的 商 业 中 立 性 和 语 言 中 立 性, 必 须 有 一 个 中 介, 存 在 于 象c + +corba 服 务 器 代 码 和java corba 客 户 机 这 样 的 实 体 之 间。 这 就 是idl。 一 个 底 层 对 象 的 若 干 相 关 方 法 和 属 性 被idl 集 入 一 个 单 一 接 口。 一 旦idl 接 口 定 义 完 成, 它 可 以 以stub 码 或 框 架 代 码(skeleton code) 的 形 式 编 译 成 你 选 用 的 语 言。 在 所 有 的orb 中 都 有 idl 编 译 器。 例 如,visigenic visibroker for java orb 中 就 含 有 java/idl 编 译 器, 而visigenic visibroker for c++ orb 则 提 供 了c + +/idl 编 译 器。

有 一 点 值 得 注 意 的 是idl 不 同 于 其 它 的 面 向 对 象 程 序 设 计 语 言, 我 们 不 能 用 它 指 定 它 所 定 义 的 类 或 是 方 法 的 具 体 实 现。 因 此, 将 它 仅 仅 作 为 一 种 定 义 底 层 对 象 接 口 的 语 言 要 好 得 多。

就 象 在java 中 将 属 性 和 方 法 封 装 到 相 关 的 类 中 一 样, 上 述 各 项 均 包 含 在idl 的 模 块 之 中。 在 一 个 模 块 之 中 可 以 定 义 一 个 或 多 个 接 口。 表 一 中 的 简 单idl 模 块 名 为themodule, 它 含 有 一 个 称 为theinterface 的 基 本 接 口。 该 接 口 仅 有 一 个 定 义 为 整 型 的 简 单 变 量( 即thevariable)。



表 1 最 简 单 的idl 模 块

module themodule
{
interface theinterface
{
long thevariable;
};
};

如 果 你 用 一 个idl 到java 的 编 译 器 编 译 这 个idl 模 块( 如visigenic 的idl2 java), 就 会 得 到 表2 中 的java 接 口。



表 2 与themodule 相 应 的java 代 码

package themodule;
public interface theinterface
{
public int thevariable;
}



orbquery 小 应 用
这 个 客 户 端 的 小 应 用 含 有 标 准 的java gui, 并 将 调 用 一 个 远 程corba 对 象。 一 旦 该 对 象 被 调 用, 就 可 以 使 用 其 方 法 获 得 某 一 指 定corba orb 的 信 息。 在 服 务 器 端, 为 了 获 得 特 定orb 的 如 下 信 息: 名 称(name)、 销 售 商(vendor)、 操 作 系 统(operating system)、 语 言(languages) 和url, 我 们 必 须 定 义 五 个 方 法。 因 此, 必 须 在idl 接 口 中 定 义 这 五 种 方 法 才 能 获 取 相 应 信 息。 表3 定 义 了 这 个 名 为orbinfo 的 接 口:



表 3: orbinfo idl 界 面

module orbquery
{
interface orbinfo
{
string getname(in long index);
string getvendor(in long index);
string getos(in long index);
string getlanguages(in long index);
string geturl(in long index);
};
};

visibroker 安 装 中 含 有 一 个idl 编 译 器 ─ ─idl2java, 你 可 以 用 它 生 成 实 现 该 接 口 必 需 的java 代 码。 软 件 安 装 完 成 之 后, 只 要 执 行 如 下 命 令 即 可 生 成 代 码:

idl2java orbinfo.idl

这 步 操 作 将 创 建 一 个 名 为orbquery 的 子 目 录( 与orbquery java 包 相 对 应)。 在 该 目 录 内 有8 个 文 件:orbinfo.java,orbinfoholder.java、orbinfo helper.java、_st_orbinfo.java,_sk_orbinfo.java、orbinfooperations.java、_tie_orbinfo.java 和_example_orbinfo.java。 你 可 能 已 经 猜 到,orbinfo.java 文 件 含 有 定 义orbinfo 接 口 的java 源 文 件, 但 其 它 的java 类 又 怎 样 呢 ?

orbinfoholder.java 文 件 内 含 有 一 个 传 递 参 数 时 使 用 的 主 类(holder class), 而orbinfo-helper 类 则 定 义 了 各 种 实 用 函 数。_st_orbinfo 类 定 义 了 客 户stub,_sk_orbinfo 定 义 了 服 务 器 框 架 类(skeleton class)。orbinfooperations 和_tie_orbinfo 类 用 于 实 现 一 种 捆 绑 机 制, 这 是visibroker 的 一 个 特 性, 它 使 得 实 现 类 能 够 继 承 框 架 类 之 外 的 类。 在 示 例 中, 我 们 不 会 直 接 使 用 这 几 个 类。 最 后,_example_orbinfo 含 有 一 个 示 例 服 务 器 对 象, 对 它 加 以 扩 展 就 可 创 建 一 个 服 务 器 应 用 程 序。

通 过idl 编 译 器 生 成 的 这 八 个java 类, 我 们 可 以 构 建 一 个 框 架, 由 一 个 接 口(interface)、 一 个stub、 一 个skeleton 和 几 个 帮 助 类, 我 们 可 以 用java 创 建 自 己 的 客 户 机/ 服 务 器 模 式 的corba 应 用 程 序。

创 建 服 务 器 应 用 程 序
下 面, 我 们 需 要 创 建 一 个 向 服 务 器orb 登 记orbinfo 对 象 的 服 务 器 应 用 程 序。 这 个 新 对 象 将 扩 充 框 架 类(skeleton class) 并 实 现orbinfo 接 口。 因 此, 该 服 务 器 共 需 两 个 新 类: 一 个 用 于 定 义 服 务 器 对 象 并 实 现orbinfo 接 口, 另 一 个 向 服 务 器orb 登 记 该 对 象。orbquery 类 包 含 的 标 准java 代 码 负 责 取 回 数 组 中 的 指 定 元 素。server 类 中 含 有corba 特 有 的 功 能。

接 下 来 的 例 子 中, 开 始 是 初 始 化orb。 然 后, 用“orbinfo” 字 符 串 向orb 登 记 类, 客 户 机 利 用 这 个 字 符 串 检 索 一 个 对 象。 所 有 的 操 作 完 成 后, 调 用boa.obj_is_ready(), 通 知orb 一 切 准 备 就 绪。

表4 是server 类, 它 向orb 登 记 了orbinfo 对 象。

表 4   服 务 器 类

public class server {
public static void main(string[] args) {
try {
// initialize the orb.
org.omg.corba.orb orb = org.omg.corba.orb.init();
// initialize the boa.
org.omg.corba.boa boa = orb.boa_init();
// create the orbquery.
orbquery serverquery = new orbquery("orbinfo");
// export the newly create object.
boa.obj_is_ready(serverquery);
system.out.println(serverquery + " is ready.");
// wait for incoming requests
boa.impl_is_ready();
}
catch(org.omg.corba.systemexception e) {
system.err.println(e);
}
}
}

表5 给 出 了orbquery 类, 它 实 现 了 接 口 及 五 个 帮 助 方 法。



表 5: orbquery 类

import java.util.*;

class orbquery extends orbquery._sk_orbinfo {
string[][] orbvendors =

{{"powerbroker","orbix","visibroker","componentbroker","
solaris neo"},
{"expersoft corp.","iona technologies","visigenic software",
"ibm","sun"},
{"ole and activex bridges; windows95/nt;
solaris; hp-ux; aix; jdk 1.0.2",
"windows95/nt, mvs, os/2, qnx, vxworks, solaris, hp-ux,
irix, aix, digital unix, ole bridge",
"windows95/nt, sun os, solaris, hp-ux, aix, irix",
"windows95/nt, solaris, hp-ux, aix, os/390, os/2, as/400",
"solaris (client & server), windows95/nt (client), jdk 1.0.2"},
{"c++, java", "java, smalltalk, ada95, c++", "java, c++",
"java, c++", "java, c++"},
{"http://www.expersoft.com", "http://www.iona.com",
"http://www.visigenic.com",
"http://www.software.ibm.com/ad/cb", "http://www.sun.com/solaris/neo/solaris_neo/index.html"}};
orbquery(string name) {
super(name);
}

public java.lang.string getname(int index)
{
string name;
name = orbvendors[index][0];
return name;
}

public java.lang.string getvendor(int index)
{
string vendor;
vendor = orbvendors[index][1];
return vendor;
}

public java.lang.string getos(int index)
{
string os;
os = orbvendors[index][2];
return os;
}

public java.lang.string getlanguages(int index)
{
string languages;
languages = orbvendors[index][3];
return languages;
}

public java.lang.string geturl(int index)
{
string url;
url = orbvendors[index][4];
return url;
}
}

至 此, 我 们 已 经 写 好 了 所 有 服 务 器 方 必 需 的 代 码, 下 一 步 的 工 作 是 创 建 客 户 小 应 用, 初 始 化 客 户orb, 进 而 击 活 并 调 用 刚 刚 生 成 的 服 务 器 对 象。

创 建corba 小 应 用
正 如 服 务 器 对 象 要 向 服 务 器orb 登 记 一 样, 客 户 端 小 应 用 或 应 用 程 序 需 要 向 客 户 机orb 登 记。 当 要 获 得 远 程corba 对 象 时, 客 户 机 采 用 了 一 种 间 接 的 方 法, 它 通 知 客 户 机orb 其 意 图, 由orb 负 责orb 到orb 的 通 讯。 这 种 请 求 方 式 由 下 面 两 行 代 码 实 现( 在visibroker for java 中):

// 初 始 化 orb ( 使 用applet)
org.omg.corba.orb orb = org.omg.corba.orb.init(this);
// 检 索applet 要 调 用 的 orbinfo 接 口 对 象
orbinfoquery= orbquery.orbinfohelper.bind(orb, "orbinfo");

执 行 了bind() 方 法 调 用 之 后, 我 们 的orbinfoquery 本 地 变 量 与 服 务 器 的orbinfo 对 象 绑 在 一 起。 这 一 操 作 完 成 之 后, 我 们 就 可 以 调 用 帮 助 方 法 来 实 现 客 户 端 小 应 用。 记 住, 尽 管 示 例 中 我 们 完 全 使 用 了java 语 言, 但 实 际 上, 服 务 器 对 象 也 可 以 用 其 他 语 言 来 实 现, 如:cobol、c + +、ada 和small talk。

结 论
与 单 纯 的java 小 应 用 相 比, 创 建corba java 应 用 稍 显 复 杂。 事 实 上, 这 同 样 比 用rmi 创 建 纯 粹 的java 分 布 式 对 象 应 用 要 难 一 些。 但 是,corba 和java 的 联 合, 所 创 建 的 应 用 程 序 功 能 更 为 强 大, 更 具 可 扩 充 性, 这 是 单 纯 用jdk 开 发 所 无 法 比 拟 的。 另 外, 现 实 是 企 业 界 很 少 使 用java 应 用 程 序。corba 是 两 全 其 美 的 选 择, 一 方 面 它 允 许 开 发 者 利 用 已 有 的 代 码 保 护 投 资, 另 一 方 面 又 可 以 充 分 发 挥java 编 程 语 言 的 优 势。



分 布 式 对 象 另 外 两 种 选 择:dcom 和rmi
大 多 数java 开 发 者 可 能 更 熟 悉dcom 和rmi, 这 是corba 两 个 主 要 的 竞 争 对 手。 现 在 让 我 们 对 三 者 做 一 下 比 较。

corba 重 述
corba 有 几 个 基 本 的 优 点: 与 开 发 语 言 无 关 的 独 立 性, 与 开 发 者 无 关 的 独 立 性 和 与 操 作 系 统 无 关 的 独 立 性。corba 的orb 在 当 前 每 一 种 主 流 操 作 系 统 上 均 有 实 现( 仅 就microsoft 的 各 种 操 作 系 统 来 说,corba 获 得 的 支 持 甚 至 超 越 了dcom)。 除 此 之 外,corba orb 可 以 访 问 多 种 语 言 实 现 的 对 象( 包 括c++、cobol、smalltalk 和java)。 借 助 于iiop, 某 一 开 发 者( 比 如 说visigenic) 开 发 的corba orb 能 够 获 取, 操 作 远 程 的 由 其 他 的 开 发 者( 比 如 说iona) 开 发 的 对 象。java orb 允 许 客 户 端 在 没 有 安 装 任 何 特 别 软 件 的 情 况 下 实 现java 客 户 端 应 用 程 序。(java orb 的 类 可 与 小 应 用 一 起 动 态 下 载, 也 可 能 与 浏 览 器 捆 绑 在 一 起。)

dcom: microsoft 的 法 宝
目 前,microsoft 的 分 布 式 组 件 对 象 模 型(distributed componont object model) 仅 运 行 于 两 种 操 作 系 统 之 上:windows 95 和windows nt4。microsoft 正 在 与 第 三 方 开 发 商 协 作, 以 将dcom 移 到 其 它 的 操 作 系 统 上( 包 括mvs 和 几 种unix 操 作 系 统)。 象corba 一 样,dcom 是 独 立 于 语 言 的, 它 用microsoft 的 对 象 描 述 语 言(odl) 通 过 接 口 对 对 象 加 以 描 述。

与corba 相 比,dcom 有 三 个 重 大 缺 点。 首 先, 它 由 单 一 开 发 者( 微 软) 定 义 并 控 制, 这 大 大 限 制 了dcom 使 用 者 的 选 择 范 围( 比 方 说 开 发 工 具 和 风 格)。 其 次,dcom 缺 乏 众 多 的 平 台 支 持, 这 极 大 程 度 地 制 约 了 代 码 的 可 重 用 性 和dcom 应 用 的 可 扩 展 性。 最 后, 与corba 相 比,dcom 是 一 种 非 常 不 成 熟 的 技 术。 尽 管 微 软 目 前 正 为dcom 加 入 消 息 和 事 务 支 持, 但 这 些 功 能 在1994 年 的corba 2.0 就 已 经 实 现 了, 并 且 正 由 几 家 不 同 的corba 软 件 开 发 商 所 发 行。

为 了 使 一 个java 的 小 应 用/ 应 用 程 序 得 以 访 问 服 务 端 的dcom 对 象, 开 发 者 不 得 不 使 用internet explorer 浏 览 器 和windows 95/nt 平 台, 只 有 这 样 才 能 支 持 客 户 机 软 件。 这 样 的 限 制 当 然 削 弱 了 应 用 程 序 在web 上 的 可 用 性。 而 另 一 方 面,dcom 的 一 个 重 大 优 势 在 于, 对microsoft windows nt/95 用 户 免 费。 过 去 的 历 史 已 经 多 次 表 明, 这 是 与microsoft 竞 争 的 重 大 障 碍。

rmi:sun 的java-only 解 决 方 案
remote method invocation 是 最 新 的jdk 1.1 中 的 重 要 特 色。rmi 使 得java 客 户 能 够 访 问 远 地 的 服 务 对 象。 这 听 起 来 似 乎 十 分 类 似 于corba, 但 两 者 并 不 一 样。 其 关 键 在 于 服 务 器 端 的 应 用 程 序 也 必 须 用java 编 写, 且 只 能 使 用jdk 1.1 中 提 供 的 工 具。 你 根 本 无 法 把 过 去 编 制 的 代 码 加 到 新 程 序 中 去, 除 此 之 外,rmi 还 有 许 多 其 它 缺 陷。

与corba 不 同,rmi 没 有 服 务 这 一 概 念。 另 外, 根 据rmi 写 出 的java 服 务 器 对 象 往 往 性 能 低 劣, 这 个 缺 点 源 于java 虚 拟 机。( 有 趣 的 是,java corba 服 务 器 比rmi 服 务 器 表 现 出 更 好 的 性 能。)rmi 也 不 包 括 象corba orb 那 样 的 对 象 击 活 功 能。

实 际 上,rmi 及java 技 术 更 可 能 向omg 的 标 准 靠 拢, 而 不 是 背 道 而 驰。sun 已 经 宣 布,java 事 务 服 务(java transaction serveces) 将 建 立 在omg 的 对 象 事 务 服 务(object transaction serveces)。 该 公 司 还 曾 发 布 其 长 远 计 划: 使rmi 对 象 可 以 通 过iiop 互 通 讯。

总 而 言 之,rmi 对 于 用 纯java 书 写 的 小 规 模 的 应 用 程 序 来 说, 是 一 种 可 行 方 案。 但corba 提 供 了 集 成 的 基 础, 这 种 集 成 是 指 新 开 发 的 代 码 和 已 有 对 象 的 集 成, 同 时 允 许 将 来 加 以 扩 展。 在 做 出 取 此 舍 彼 的 选 择 之 前, 你 必 须 权 衡 上 面 的 各 种 因 素, 并 仔 细 审 视 每 种 技 术 的 现 状。

扫描关注微信公众号