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

深入探索 CORBA 技術:從 IDL 定義到分布式應用實戰

     編輯:Java 相關知識

前言

上月我們探討了為何選擇 CORBA 與 Java 技術。本月將通過一個簡單可用的示例,帶領您探索 CORBA 技術的核心領域。我們的目標是構建一個分布式應用:客戶端駐留於一台計算機,向運行於另一台計算機的服務發出請求,無需關心硬件或作業系統細節,只需服務能響應請求即可。

IDL 接口定義:分布式系統的契約

CORBA 的所有結構始於接口。正如汽車的標準化介面(方向盤、油門、剎車)讓駕駛者無需適應即可上路,CORBA 通過接口定義語言 (IDL) 定義客戶端如何向服務發出請求,實現跨語言、跨平台的互操作。

計算器接口示例

module corbasem {
    module gen {
        module calcsimpl {
            interface calculator {
                long add(in long x, in long y);
            };
        };
    };
};

關鍵字解析

  • module:建立命名空間,映射為 Java package,編譯後生成對應子目錄
  • interface:映射為 Java interface,定義通訊契約而非實現
  • long:IDL 基本整數類型,至少 4 字節,映射為 Java int
  • in:參數傳遞方向關鍵字,表示從客戶端傳向服務端。另有 out (服務端→客戶端) 和 inout (雙向)

明確參數方向讓 ORB (Object Request Broker) 能高效處理參數打包、解包與內存管理。

IDL-to-Java 編譯器:自動生成分布式基礎設施

IDL 編譯器是實現 CORBA 2.3 規範中 IDL 到 Java 語言映射的程序,自動生成 Stub、Skeleton 及支援文件,處理網絡「管道」代碼,強制封裝規範,避免手工編寫的繁瑣與錯誤。

推薦工具

  • Orbacus ORB (Object Oriented Concepts, Inc.):非商業用途免費,完全符合 CORBA 2.3
  • Visibroker (Inprise):可試用 60 天,同樣符合 CORBA 2.3

編譯命令與生成文件

jidl --output-dir c:\_work\corbasem calculator.idl

生成六個核心文件:

文件角色說明
calculator.java標記接口擴展 IDLEntity,提供類型標記供其他接口方法聲明使用
calculatorOperations.java操作接口包含映射的操作簽名,標記接口擴展此接口
calculatorHelper.java輔助類含關鍵 narrow() 方法,將 org.omg.CORBA.Object 縮窄為具體類型引用
calculatorHolder.java持有者類用於通過引用傳遞參數,本示例暫不使用
calculatorPOA.javaSkeleton 類提供請求-響應管道核心,基於繼承實現 (預設)
_calculatorStub.javaStub 類客戶端調用代理,處理參數打包與網絡通訊

服務端實現

1. 業務邏輯實現

SimpleCalcServant extends calculatorPOA {
    public int add(int x, int y) {
        return x + y;
    }
}

實現類擴展生成的 calculatorPOA,請求經 ORB → Skeleton → Servant 處理並響應。

2. ORB 初始化與配置

Properties props = System.getProperties();
props.put("org.omg.CORBA.ORBClass", "com.ooc.CORBA.ORG");
props.put("org.omg.CORBA.ORBSingletonClass", "com.ooc.CORBA.ORBSingleton");
ORB orb = ORB.init(args, props);

指定 ORB 實現類 (此處為 Orbacus)。理想情況下應外部化配置,便於切換 ORB 供應商無需重編碼。

3. POA (Portable Object Adapter) 環境建立

POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
POAManager manager = rootPOA.the_POAManager();

POA 取代了供應商各異的 BOA,提供標準化的對象生存環境管理。本例直接使用根 POA 簡化演示。

4. 實例化與對象引用發佈

SimpleCalcServant calcSvt = new SimpleCalcServant();
calculator calc = calcSvt._this(orb);  // 獲取 CORBA 對象引用

PrintWriter refstr = new PrintWriter(new FileWriter("calcref.ior"));
refstr.println(orb.object_to_string(calc));  // 寫入文件供客戶端獲取
refstr.close();

5. 啟動服務

manager.activate();  // 激活 POA,開始排隊請求
System.out.println("SimpleCalcSvr is running!");
orb.run();  // 進入事件循環接收請求

客戶端實現

客戶端與服務端結構鏡像:打包參數→發送請求→解包響應。關鍵差別在於如何定位服務對象。

1. ORB 初始化 (同服務端)

Properties props = System.getProperties();
props.put("org.omg.CORBA.ORBClass", "com.ooc.CORBA.ORG");
props.put("org.omg.CORBA.ORBSingletonClass", "com.ooc.CORBA.ORBSingleton");
ORB orb = ORB.init(args, props);

必須使用支援 IIOP (Internet Inter-ORB Protocol) 的 ORB 才能跨供應商互操作。

2. 獲取對象引用並調用

BufferedReader in = new BufferedReader(new FileReader("calcref.ior"));
String ior = in.readLine();
in.close();

calculator calc = calculatorHelper.narrow(orb.string_to_object(ior));
System.out.println(calc.add(2, 3));

calculatorHelper.narrow() 將通用對象引用縮窄為計算器類型,隨後即可像本地對象一樣調用 add()。

總結與展望

客戶端完全隔離於服務端實現細節:不知硬體、OS、語言、線程模型、甚至物理位置。只知調用 calc.add() 會得到預期響應。這如同撥打電話——只在乎通話接通,不在乎光纖還是衛星傳輸。

下月我們將深入探討表象之下 IIOP 的神奇力量。

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