CORBA(Common Object Request Broker Architecture, 公共對象請求代理體系結構)是由OMG(對象管理組織,Object Management Group)提出的應用軟件體系結構和對象技術規范,被廣泛的用來開發分布式系統。Apusic應用服務器(網站服務器培訓 郵件服務器培訓 視訊服務器培訓 )是以RMI-IIOP(Remote Method Invocation Internet Inter-ORB Protocol)協議為基礎完成分布式的對象的遠程訪問,因此可以和CORBA對象進行互相調用。並且,Apusic應用服務器還完整的實現了CORBA-EJB映射規范,能夠在多個應用服務器實例和CORBA客戶端之間傳播事務、安全等上下文信息。CORBA和EJB的互操作規范包含以下四個方面:
EJB接口到CORBA接口的映射;
JNDI名字到CORBA名稱服務(CosNaming )的映射;
EJB和CORBA之間的事務傳播;
EJB和CORBA之間的安全傳播。
本文將通過一個范例展示CORBA客戶端訪問部署在Apusic上的EJB。雖然這是Apusic和CORBA互操作最簡單的一個方面,並且不涉及安全和事務的傳播,但已經顯示了Apusic在互操作方面的能力和開發的一般步驟。
首先介紹一下服務器和客戶端的開發運行環境。服務器端的環境為:
Windows 2000 Server
JDK1.4.2
Apusic應用服務器3.0
客戶端的環境為:
Windows 2000 Professional
JDK1.4.2
Apusic應用服務器完全支持標准的EJB-CORBA映射,也就是說,EJB的home和remote也是CORBA對象。我們可以使用JDK提供的RMI編譯器rmic -idl為EJB產生CORBA視圖的IDL接口。用來定位EJB home接口的JNDI(Java naming service)被映射成CORBA naming service,這樣,CORBA客戶端就能查找和定位home接口並象CORBA對象一樣使用它們。下圖描述了CORBA客戶端訪問EJB的一般步驟:這些步驟包括:
開發並部署EJB;
使用RMI編譯器rmic -idl為EJB遠程接口產生IDL;
使用CORBA IDL編譯器根據客戶端的程序語言為客戶端產生存根(stub);
配置EJB服務器使用CORBA名稱服務。Apusic缺省就使用CORBA名稱服務作為JNDI 服務的提供者;
CORBA客戶端在CORBA名稱服務中查找和定位EJB;
CORBA客戶端象訪問普通CORBA對象一樣訪問EJB;
首先開發一個EJB模塊,編譯並部署到Apusic應用服務器上。這個例子中的EJB非常簡單,是一個Stateless Session Bean,只包含一個業務方法sayHello。
public java.lang.String sayHello(Java.lang.String name) {
String result = "hello, " + name;
System.out.println("invoke sayHello() : " + result);
return result;
}
然後使用RMI編譯器rmic -idl為EJB遠程接口產生IDL:
rmic -idl -noValueMethods
-classpath %apusic_home%/lib/apusic.jar;../ejb/build
-d idl samples.ejb.Hello samples.ejb.HelloHome
理論上可以使用任何CORBA規范支持的程序語言開發CORBA客戶端。本范例展示的是Java CORBA客戶端的開發。使用JDK1.4.2提供的idlj編譯上一步得到的IDL:
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
注意,我們為IDL文件中的java、javax和samples模塊在生成代碼時增加了“apusic”作為package的前綴,這樣可以避免同Java核心API的沖突。
JDK1.4.2提供的idlj編譯器生成的Java代碼包含了bug,必須手工更改這些錯誤。將類_Exception.java,CreateException.java和RemoveException.Java中的_read和 _write方法注釋或刪掉。
這時,我們根據IDL編譯器編譯生成的Java文件,提供客戶端實現,主程序的代碼片斷如下:
ORB orb = ORB.init(args, null);
// Look up the HelloHome, create an Hello and use it.
NamingContextExt nc =
NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
HelloHome home =
HelloHomeHelper.narrow(nc.resolve_str("ejb/CORBAClIEntSample"));
Hello hello = home.create();
String str = (String) hello.sayHello("apusic,corba clIEnt");
System.out.println(str);
System.exit(0);
從上面的代碼中我們看到了CORBA客戶端如何在CORBA名稱服務中查找和定位EJB,並且如何象訪問普通CORBA對象一樣訪問EJB。
最後我們編譯並運行客戶端。注意,我們並不需要編譯所有idlj生成的Java源文件,只要編譯包apusic.sample.ejb和我們編寫的客戶端主程序。Java編譯器會根據類的連接情況自動編譯類中引用的其他類。
javac -d ../build -sourcepath ./ apusicsamplesejb*.Java
javac -d ../build -sourcepath ./ CorbaClIEnt.Java
確認EJB已經部署在Apusic上並且服務器正常運行。在命令行啟動CORBA客戶端,通過啟動參數告訴客戶端Apusic的位置和端口,來保證客戶端ORB的正確初始化。假定Apusic運行在本機上,端口為6888:
Java CorbaClIEnt -ORBInitialHost localhost -ORBInitialPort 6888
如果前面的步驟都正確完成,我們將在客戶端的屏幕上看到: hello, apusic,corba clIEnt
這個例子只是簡單的展示了CORBA客戶端能夠訪問EJB組件的業務方法。實際上CORBA和EJB的互操作復雜的地方在於事務和安全的映射,因此要求開發者對CORBA規范和開發比較熟悉。而且Java到IDL的映射可能遇到很多問題,例如:ValueType映射,集合的使用等,這就使CORBA客戶端訪問EJB在很多情況下不能成功。即使如此,Apusic支持和CORBA的互操作,依然對我們集成已有的CORBA系統、開發異構環境的分布式應用提供了很大的幫助,只是對開發人員的技術要求比較高。