Java IDL 是 Java 2 平台的 CORBA 功能擴展,支持用 OMG IDL 定義服務接口,按規範映射為 Java 語言,構建基於 IIOP 協議的互操作分布式應用。本文詳細闡述 Java IDL 運行時組件、開發流程,並通過完整示例演示從 IDL 定義到客戶端/服務端實現的全過程。
getMessage.idl)module getMessage {
interface getIt {
string returnObject();
};
};
idltojava -fno-cpp getMessage.idl
生成 getMessage/ 包下的 Stub、Skeleton、Helper 等類。
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
import getMessage.*;
public class Client {
public static void main(String[] args) {
// 初始化 ORB
ORB orb = ORB.init(args, null);
// 獲取命名服務
org.omg.CORBA.Object namingObj = orb.resolve_initial_references("NameService");
NamingContext namingContext = NamingContextHelper.narrow(namingObj);
// 解析對象引用
NameComponent nc = new NameComponent("getMessage", "");
NameComponent[] path = {nc};
getIt service = getItHelper.narrow(namingContext.resolve(path));
// 遠程調用
String result = service.returnObject();
System.out.println("服務返回: " + result);
}
}
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
import getMessage.*;
class ReturnMethodImpl extends _getItImplBase {
public String returnObject() {
return "How about it";
}
}
public class Server {
public static void main(String[] args) {
ORB orb = ORB.init(args, null);
// 創建服務對象並註冊到 ORB
ReturnMethodImpl obj = new ReturnMethodImpl();
orb.connect(obj);
// 綁定到命名服務
org.omg.CORBA.Object namingObj = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(namingObj);
NameComponent nc = new NameComponent("getMessage", "");
NameComponent[] path = {nc};
ncRef.rebind(path, obj);
// 保持進程運行等待調用
synchronized(new Object()) { try { new Object().wait(); } catch(Exception e) {} }
}
}
# 編譯
javac getMessage/*.java
javac getMessage/Server.java
javac getMessage/Client.java
# 運行(需三個終端)
# 終端1: 啟動命名服務 (端口 3388)
tnameserv -ORBInitialPort 3388
# 終端2: 啟動服務端
java getMessage.Server -ORBInitialPort 3388
# 終端3: 啟動客戶端
java getMessage.Client -ORBInitialPort 3388
rebind/resolve),另可用字符串化對象引用(orb.object_to_string())。-ORBInitialPort 指定命名服務端口,生產環境常配置 -ORBInitialHost。SystemException、ApplicationException 等 CORBA 異常體系。Java IDL 提供標準 CORBA 實現,適合異構系統集成、跨語言遠程調用場景。雖然 RMI、Web Services、gRPC 等技術更流行,但在嚴格遵循 OMG 標準、需與 C++/COBOL 等舊系統互操作的企業級項目中,Java IDL 仍具不可替代價值。