XML 作為中性、可擴展的資料交換格式,已成為企業間資料整合的首選。本文探討在分散式環境下,如何讓運行於不同 Java 虛擬機的應用程式透過 XML 進行通訊,並詳細比較三種實作方案:標準 Web 伺服器、Java RMI 序列化、CORBA-IIOP 的優劣與適用場景。
核心流程:資料來源 (如關聯式資料庫) → Java 處理器產生 DOM 物件 → 發送者傳輸 → 接收者解析還原 DOM → 後續處理器處理。發送者與接收者分別運行於不同 JVM,雙向通訊,皆為客戶端亦為伺服端角色。

圖1:處理 XML 文件的 Java 分散式應用簡單模型
Xbeans 是接受 XML DOM 文件輸入、處理後輸出 XML DOM 的軟體元件,基於 JavaBeans 規範,支援封裝、重用、連接與客製化。輸入輸出均為 W3C 標準 DOM 物件,而非原始字串。源碼可從 www.xbeans.org 免費取得。

圖2:Xbeans 元件示意圖
將 DOM 序列化為文字傳輸,接收端再解析還原 DOM。通用性最高,幾乎所有 Web 伺服器支援 CGI,接收端易以 URL 識別。

圖3:標準 Web 伺服器通訊流程
// 發送者片段 (使用 IBM DOMWriter)
public void documentReady(DOMEvent evt) throws XbeansException {
try {
URL receiver = new URL(getRemoteURL());
URLConnection conn = receiver.openConnection();
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
DOMWriter writer = new DOMWriter();
writer.setPrintWriter(new PrintWriter(out));
writer.documentReady(new DOMEvent(this, evt.getDocument()));
out.close();
// 處理回應...
} catch (Throwable e) { e.printStackTrace(System.err); }
}
利用 Java RMI 直接傳遞序列化後的 DOM 物件,避免文字解析開銷,支援接收端自動啟動,但限於 Java 之間通訊,且雙端需使用相同 DOM 實作。

圖4:RMI 序列化通訊流程
// 發送者
public void documentReady(DOMEvent evt) throws XbeansException {
if (DOMListener == null) {
DOMListener = (DOMListener) Naming.lookup(getReceiverName());
}
DOMListener.documentReady(evt);
}
// 接收者實作 Remote 介面
public void documentReady(Document incomingDocument) throws RemoteException, XbeansException {
DOMListener.documentReady(new DOMEvent(this, incomingDocument));
}
採用 CORBA 標準,透過 IDL 定義介面,理論上支援異構語言互通。OMG 正擴展 IDL 支援 XML 資料類型。實作需部署 ORB,發送者使用 URL 命名模式定位接收者。

圖5:CORBA-IIOP 通訊流程
// IDL 介面定義
interface XMLReceiver {
void documentReady(in byteArray serializedDocument) raises(RemoteReceiverException);
}
// 發送者序列化 DOM 並透過 CORBA 傳送
// 接收者反序列化並轉發給本地監聽器

圖6:各方案優缺點總結
關鍵在於將 XML 通訊邏輯從業務邏輯中分離,封裝為可替換的軟體元件 (如 Xbeans)。如此可根據部署環境、效能需求、異構整合要求,靈活切換通訊協定,不影響核心應用實作。