Apusic 基於 RMI-IIOP 協議實現分散式物件遠程訪問,天然支援與 CORBA 物件互調。完整實現 CORBA-EJB 映射規範,涵蓋四大核心映射:
| 層面 | 伺服器端 | 客戶端 |
|---|---|---|
| 作業系統 | Windows 2000 Server | Windows 2000 Professional |
| JDK | 1.4.2 | 1.4.2 |
| 應用伺服器 | Apusic 3.0 | — |
// 遠程介面
public interface Hello extends javax.ejb.EJBObject {
String sayHello(String name) throws java.rmi.RemoteException;
}
// Home 介面
public interface HelloHome extends javax.ejb.EJBHome {
Hello create() throws java.rmi.RemoteException, javax.ejb.CreateException;
}
// Bean 實作
public class HelloBean implements javax.ejb.SessionBean {
public String sayHello(String name) {
String result = "hello, " + name;
System.out.println("invoke sayHello(): " + result);
return result;
}
// ejbCreate/Activate/Passivate/Remove/setSessionContext 空實作
}
部署至 Apusic,JNDI 名稱綁定為 ejb/CORBAClientSample。
rmic -idl 生成 IDLrmic -idl -noValueMethods \
-classpath %APUSIC_HOME%/lib/apusic.jar;../ejb/build \
-d idl \
samples.ejb.Hello samples.ejb.HelloHome
-noValueMethods:不生成值型別方法 (簡化 IDL)-d idl:輸出目錄Hello.idl、HelloHome.idlidlj 為 Java CORBA 客戶端生成存根idlj -emitAll -i ./idl -i %JAVA_HOME%/lib \
-fclient \
-pkgPrefix java apusic \
-pkgPrefix javax apusic \
-pkgPrefix samples apusic \
-td src \
./idl/samples/ejb/Hello.idl
idlj -emitAll -i ./idl -i %JAVA_HOME%/lib \
-fclient \
-pkgPrefix java apusic \
-pkgPrefix javax apusic \
-pkgPrefix samples apusic \
-td src \
./idl/samples/ejb/HelloHome.idl
關鍵參數:-pkgPrefix 為 java/javax/samples 套件加前綴 apusic,避免與核心 API 衝突。
idlj 已知 Bug生成的 _Exception.java、CreateException.java、RemoveException.java 中的 _read、_write 方法有缺陷,必須手工註釋或刪除 這兩個方法。
javac -d ../build -sourcepath ./ apusic.samples.ejb*.java
javac -d ../build -sourcepath ./ CorbaClient.java
僅需編譯 apusic.samples.ejb 套件與主程式,javac 會自動編譯依賴類別。
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
import apusic.samples.ejb.*;
public class CorbaClient {
public static void main(String[] args) {
// 1. 初始化 ORB,傳入 Apusic 位址埠
ORB orb = ORB.init(args, null);
// 2. 解析命名服務
NamingContextExt nc = NamingContextExtHelper.narrow(
orb.resolve_initial_references("NameService")
);
// 3. 查找 EJB Home (JNDI 名稱映射至 CORBA 命名)
HelloHome home = HelloHomeHelper.narrow(
nc.resolve_str("ejb/CORBAClientSample")
);
// 4. 建立 EJB 並呼叫業務方法
Hello hello = home.create();
String str = hello.sayHello("apusic,corba client");
System.out.println(str); // 輸出: hello, apusic,corba client
System.exit(0);
}
}
java CorbaClient -ORBInitialHost localhost -ORBInitialPort 6888
# 6888 為 Apusic IIOP 監聽埠 (預設)
# 輸出: hello, apusic,corba client
| 挑戰 | 說明 | 解決方案 |
|---|---|---|
| Value Type 映射 | Java 序列化物件 ↔ CORBA 值型別 | 實作 CustomValueFactory、使用 rmic -idl 正確生成值型別 IDL |
| 集合類型映射 | Java Collection ↔ CORBA Sequence | IDL 中定義 sequence<Type>,確保雙向轉換正確 |
| 事務傳播 | JTA 事務 ↔ OTS (Object Transaction Service) | Apusic 實現事務上下文傳播,需配置 TransactionFactory |
| 安全傳播 | JAAS Subject ↔ CSIv2 (Common Secure Interop) | 配置 Principal 權杖傳播、SSL 互信 |
| 異常映射 | EJB Exception ↔ CORBA System/User Exception | 定義 IDL 例外對應、ExceptionHelper 正確 narrow |
| idlj Bug | JDK 1.4.2 生成代碼缺陷 | 手工修復 _read/_write,或升級 JDK/使用第三方 IDL 編譯器 |
Apusic 與 CORBA 互操作展示了「標準協議 (RMI-IIOP/IIOP) + 標準映射 (CORBA-EJB) + 成熟產品實現」的威力。雖開發者需具備 CORBA 規範、IDL 編譯、異常映射、事務/安全傳播等深度技能,但對於「保護既有 CORBA 資產投資、構建異構企業級服務總線」的戰略需求,此方案提供了可靠、標準、生產就緒的技術路徑。核心成功要素:IDL 正確生成、存根正確編譯、命名服務正確映射、上下文傳播正確配置 四大支柱缺一不可。