Apusic應(yīng)用服務(wù)器3.0   
  
    客戶端的環(huán)境為:   
  
       Windows 2000 Professional   
  
       JDK1.4.2   
  
    Apusic應(yīng)用服務(wù)器完全支持標(biāo)準(zhǔn)的EJB-CORBA映射,也就是說,EJB的home和remote也是CORBA對(duì)象。我們可以使用JDK提供的RMI編譯器rmic -idl為EJB產(chǎn)生CORBA視圖的IDL接口。用來定位EJB home接口的JNDI(Java naming service)被映射成CORBA naming service,這樣,CORBA客戶端就能查找和定位home接口并象CORBA對(duì)象一樣使用它們。下圖描述了CORBA客戶端訪問EJB的一般步驟:這些步驟包括:   
  
     開發(fā)并部署EJB;   
  
     使用RMI編譯器rmic -idl為EJB遠(yuǎn)程接口產(chǎn)生IDL;   
  
     使用CORBA IDL編譯器根據(jù)客戶端的程序語言為客戶端產(chǎn)生存根(stub);   
  
     配置EJB服務(wù)器使用CORBA名稱服務(wù)。Apusic缺省就使用CORBA名稱服務(wù)作為JNDI 服務(wù)的提供者;  
  
     CORBA客戶端在CORBA名稱服務(wù)中查找和定位EJB;   
  
     CORBA客戶端象訪問普通CORBA對(duì)象一樣訪問EJB;   
  
    首先開發(fā)一個(gè)EJB模塊,編譯并部署到Apusic應(yīng)用服務(wù)器上。這個(gè)例子中的EJB非常簡(jiǎn)單,是一個(gè)Stateless Session Bean,只包含一個(gè)業(yè)務(wù)方法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遠(yuǎn)程接口產(chǎn)生IDL:  
  
   rmic -idl -noValueMethods  
  
   -classpath %apusic_home%/lib/apusic.jar;/ejb/build   
  
   -d idl samples.ejb.Hello samples.ejb.HelloHome 
  
    理論上可以使用任何CORBA規(guī)范支持的程序語言開發(fā)CORBA客戶端。本范例展示的是Java CORBA客戶端的開發(fā)。使用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  
  
    注意,我們?yōu)镮DL文件中的java、javax和samples模塊在生成代碼時(shí)增加了“apusic”作為package的前綴,這樣可以避免同Java核心API的沖突。   
  
    JDK1.4.2提供的idlj編譯器生成的Java代碼包含了bug,必須手工更改這些錯(cuò)誤。將類_Exception.java,CreateException.java和RemoveException.java中的_read和 _write方法注釋或刪掉。 
  
    這時(shí),我們根據(jù)IDL編譯器編譯生成的Java文件,提供客戶端實(shí)現(xiàn),主程序的代碼片斷如下:   
  
   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名稱服務(wù)中查找和定位EJB,并且如何象訪問普通CORBA對(duì)象一樣訪問EJB。  
  
    最后我們編譯并運(yùn)行客戶端。注意,我們并不需要編譯所有idlj生成的Java源文件,只要編譯包apusic.sample.ejb和我們編寫的客戶端主程序。Java編譯器會(huì)根據(jù)類的連接情況自動(dòng)編譯類中引用的其他類。 
  
   javac -d /build -sourcepath ./ apusicsamplesejb*.java 
  
   javac -d /build -sourcepath ./ CorbaClient.java  
  
    確認(rèn)EJB已經(jīng)部署在Apusic上并且服務(wù)器正常運(yùn)行。在命令行啟動(dòng)CORBA客戶端,通過啟動(dòng)參數(shù)告訴客戶端Apusic的位置和端口,來保證客戶端ORB的正確初始化。假定Apusic運(yùn)行在本機(jī)上,端口為6888:  
  
    java CorbaClient -ORBInitialHost localhost -ORBInitialPort 6888 
  
    如果前面的步驟都正確完成,我們將在客戶端的屏幕上看到: hello, apusic,corba client   
  
    這個(gè)例子只是簡(jiǎn)單的展示了CORBA客戶端能夠訪問EJB組件的業(yè)務(wù)方法。實(shí)際上CORBA和EJB的互操作復(fù)雜的地方在于事務(wù)和安全的映射,因此要求開發(fā)者對(duì)CORBA規(guī)范和開發(fā)比較熟悉。而且Java到IDL的映射可能遇到很多問題,例如:ValueType映射,集合的使用等,這就使CORBA客戶端訪問EJB在很多情況下不能成功。即使如此,Apusic支持和CORBA的互操作,依然對(duì)我們集成已有的CORBA系統(tǒng)、開發(fā)異構(gòu)環(huán)境的分布式應(yīng)用提供了很大的幫助,只是對(duì)開發(fā)人員的技術(shù)要求比較高。

分享到

多易

相關(guān)推薦