在分散式物件架構中,CORBA (Common Object Request Broker Architecture) 提供跨語言、跨平台的遠端物件呼叫能力。相較於微軟的 DCOM 侷限於 Windows,CORBA 適合異構環境。本文以 Inprise VisiBroker ORB 為例,示範如何用 Java 建立簡單的計數器服務,涵蓋 IDL 定義、Stub/Skeleton 生成、伺服端與客戶端實作、部署測試全流程。
vbjorb.jar、vbjapp.jar、vbjtools.jar。osagent 服務(預設埠 14000),作為物件目錄代理。建立 Counter.idl,宣告模組 Counter 與介面 Count,包含 increment() 與 getCounter() 兩個操作。
// Counter.idl
module Counter {
interface Count {
void increment();
long getCounter();
};
};
執行 idl2java Counter.idl,將產生:
CountHelper.java、_st_Count.java (Stub)_CountImplBase.java、_sk_Count.java (Skeleton)繼承 _CountImplBase 實作業務邏輯,私有計數器 c。
// CountImpl.java
public class CountImpl extends Counter._CountImplBase {
private int c = 0;
public CountImpl(String name) { super(name); }
public CountImpl() { super(); }
public void increment() { c++; System.out.println(c); }
public int getCounter() { return c; }
}
伺服端主程式初始化 ORB 與 BOA,註冊物件名稱為 "test"。
// Server.java
public class Server {
public static void main(String[] args) {
try {
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
org.omg.CORBA.BOA boa = orb.BOA_init();
Counter.Count count = new CountImpl("test");
boa.obj_is_ready(count);
System.out.println(count + " ready.");
boa.impl_is_ready();
} catch (Exception e) { e.printStackTrace(); System.exit(1); }
}
}
客戶端初始化 ORB,透過 CountHelper.bind() 取得遠端物件參考,呼叫方法並印出結果。建議加入完整的例外處理。
// Client.java
public class Client {
public static void main(String[] args) {
Counter.Count count = null;
org.omg.CORBA.ORB orb = null;
try {
orb = org.omg.CORBA.ORB.init();
count = Counter.CountHelper.bind(orb, "test");
count.increment();
System.out.println("Current Count = " + count.getCounter());
} catch (Exception e) { e.printStackTrace(); System.exit(1); }
finally {
try { if (orb != null) orb.shutdown(); } catch (Exception ignored) {}
}
}
}
# 編譯
vbjc Counter.idl
vbjc Server.java CountImpl.java
vbjc Client.java
# 啟動服務
osagent &
vbj Server
# 執行客戶端
osfind
vbj Client
重複執行 Client 可觀察計數器遞增,驗證狀態保持於伺服端。
同樣原理可應用於 Applet,於 init() 初始化 ORB 並綁定物件,按鈕事件觸發 increment(),paint() 顯示最新計數。編譯後以 appletviewer 執行 HTML 頁面即可。