學習使用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 提 供 了 集 成 的 基 礎, 這 種 集 成 是 指 新 開 發 的 代 碼 和 已 有 對 象 的 集 成, 同 時 允 許 將 來 加 以 擴 展。 在 做 出 取 此 捨 彼 的 選 擇 之 前, 你 必 須 權 衡 上 面 的 各 種 因 素, 並 仔 細 審 視 每 種 技 術 的 現 狀。