首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

CORBA 實戰範例:基於 Java IDL 建構時間服務

     編輯:Java 相關知識

開發流程總覽

  1. 定義 IDL 介面契約
  2. IDL 編譯生成 Java 存根/骨架
  3. 實現伺服器端業務邏輯 (Servant)
  4. 實現客戶端調用邏輯
  5. 啟動命名服務
  6. 啟動伺服器註冊物件引用
  7. 運行客戶端查找並調用

1. IDL 定義 (RemoteTime.idl)

module RemoteTime {
    interface ExactTime {
        string getTime();
    };
};
  • module 對應 Java 套件
  • interface 映射為 Java 介面
  • 單一方法返回當前時間字串

2. IDL 編譯

idltojava -fserver -fclient RemoteTime.idl

產出關鍵檔案:

  • RemoteTime/ExactTime.java — 客戶/伺服器共用介面
  • RemoteTime/_ExactTimeImplBase.java — 伺服器端繼承基類 (POA 骨架)
  • RemoteTime/_ExactTimeStub.java — 客戶端存根
  • RemoteTime/ExactTimeHelper.java — 窄化轉換工具
  • 命名服務輔助類

3. 伺服器端實現

// Servant 實現
class ExactTimeServer extends _ExactTimeImplBase {
    public String getTime() {
        return DateFormat.getTimeInstance(DateFormat.FULL)
                       .format(new Date(System.currentTimeMillis()));
    }
}

// 主程式:啟動 ORB、註冊命名服務、等待請求
public class RemoteTimeServer {
    public static void main(String[] args) {
        try {
            ORB orb = ORB.init(args, null);
            
            // 建立並連接 Servant
            ExactTimeServer servant = new ExactTimeServer();
            orb.connect(servant);
            
            // 獲取命名服務根上下文
            org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
            NamingContext ncRef = NamingContextHelper.narrow(objRef);
            
            // 綁定名稱 "ExactTime"
            NameComponent nc = new NameComponent("ExactTime", "");
            NameComponent[] path = {nc};
            ncRef.rebind(path, servant);
            
            System.out.println("Time Server ready...");
            // 阻塞主執行緒
            synchronized(new Object()) { while(true) wait(); }
        } catch (Exception e) { e.printStackTrace(); }
    }
}

4. 客戶端實現


public class RemoteTimeClient {
    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("ExactTime", "");
            NameComponent[] path = {nc};
            ExactTime timeRef = ExactTimeHelper.narrow(ncRef.resolve(path));
            
            // 遠程調用
            String exactTime = timeRef.getTime();
            System.out.println("Current time: " + exactTime);
        } catch (Exception e) { e.printStackTrace(); }
    }
}

5. 部署與運行步驟

  1. 啟動命名服務 (Java IDL 內建):
    tnameserv -ORBInitialPort 900  # 預設埠 900
    
  2. 啟動伺服器:
    java -classpath . RemoteTimeServer -ORBInitialPort 900 -ORBInitialHost localhost
    
  3. 啟動客戶端:
    java -classpath . RemoteTimeClient -ORBInitialPort 900 -ORBInitialHost localhost
    

關鍵技術點解析

  • 臨時物件 vs 持久物件:範例為臨時物件 (進程結束即失效);生產環境需 POA 持久化策略或 Implementation Repository
  • 命名服務角色:字串名稱 ↔ 物件引用 (IOR) 映射,實現位置透明
  • 窄化:Helper.narrow() 將通用 org.omg.CORBA.Object 安全轉為具體介面
  • 異構部署:伺服器/客戶端可分別用 C++/Java 實現,共享同一 IDL

常見問題排查

  • COMM_FAILURE:檢查防火牆、ORB 埠、主機名解析
  • OBJECT_NOT_EXIST:命名服務未啟動、綁定名稱錯誤、伺服器未註冊
  • MARSHAL:IDL/存根版本不一致,重新編譯部署
  • ClassNotFound:CLASSPATH 缺少生成的存根/骨架類

總結

本範例展示了 CORBA 最核心的「IDL 定義 → 編譯映射 → 命名服務註冊/查找 → 遠程調用」完整閉環。Java IDL (JDK 內建) 提供零成本入門體驗,生產級系統建議採用高效能商用 ORB (VisiBroker, Orbix, OpenORB) 並配置持久 POA、負載均衡、安全傳輸 (SSLIOP) 等企業級特性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved