CORBA (Common Object Request Broker Architecture) 透過 IDL (Interface Definition Language) 定義跨語言介面,Java IDL 提供標準 API 實現分散式物件呼叫。本文以最簡單的 "Hello World" 為例,示範 IDL 定義、Stub/Skeleton 產生、Server/Client 實作完整流程。
// hello.idl
module HelloApp {
interface Hello {
string sayHello();
};
};
module 對應 Java 套件interface 定義遠端方法# JDK 內建 idlj 工具(舊版為 idltojava)
idlj -fall hello.idl
產生檔案結構:
HelloApp/Hello.java:客戶端介面HelloApp/HelloHelper.java:窄化輔助類HelloApp/_HelloImplBase.java:伺服端繼承基類HelloApp/HelloHolder.java:out/inout 參數持有者// HelloServant.java
import HelloApp.*;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
public class HelloServant extends _HelloImplBase {
public String sayHello() {
return "Hello CORBA World!!";
}
}
// HelloServer.java
public class HelloServer {
public static void main(String[] args) {
try {
// 1. 初始化 ORB
ORB orb = ORB.init(args, null);
// 2. 建立 Servant 並註冊至 ORB
HelloServant helloRef = new HelloServant();
orb.connect(helloRef);
// 3. 取得命名服務根上下文
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
// 4. 綁定物件參考
NameComponent nc = new NameComponent("Hello", "");
NameComponent[] path = {nc};
ncRef.rebind(path, helloRef);
System.out.println("HelloServer ready...");
// 5. 等待客戶端呼叫
java.lang.Object sync = new java.lang.Object();
synchronized (sync) { sync.wait(); }
} catch (Exception e) { e.printStackTrace(); }
}
}
// HelloClient.java
import HelloApp.*;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
public class HelloClient {
public static void main(String[] args) {
try {
ORB orb = ORB.init(args, null);
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
NameComponent nc = new NameComponent("Hello", "");
NameComponent[] path = {nc};
Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
System.out.println(helloRef.sayHello());
} catch (Exception e) { e.printStackTrace(); }
}
}
# 1. 編譯所有 Java 檔
javac *.java HelloApp/*.java
# 2. 啟動命名服務(JDK 內建 tnameserv 或 orbd)
tnameserv -ORBInitialPort 1050 &
# 3. 啟動 Server
java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost
# 4. 執行 Client
java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost
輸出:Hello CORBA World!!
_HelloImplBase,現代應用建議使用 PortableServer.POA 獲得更好可攜性string→String、sequence→陣列、exception→Java ExceptionJava CORBA 透過標準 IDL 實現語言中立的分散式呼叫,雖然現代微服務多採用 REST/gRPC,但在異構舊系統整合、電信/金融核心系統中仍有應用。掌握 IDL→Java 映射、ORB 初始化、命名服務綁定/查找四大步驟,即可快速建立 CORBA 應用原型。