46.3. CORBA客户端开发

CORBA客户端可以通过IIOP访问EJB组件。金蝶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对象一样使用它们。下图描述了Java到IDL映射的步骤:

Java到IDL映射

这些步骤包括:

1. 使用RMI编译器rmic -idl为EJB远程接口产生IDL;

2. 使用CORBA IDL编译器根据客户端的程序语言为客户端产生存根(stub);

3. 配置EJB服务器使用CORBA名称服务。金蝶Apusic应用服务器缺省就使用CORBA名称服务作为JNDI 服务的提供者;

4. CORBA客户端在CORBA名称服务中查找和定位EJB;

5. CORBA客户端象访问普通CORBA对象一样访问EJB;

46.3.1. 开发CORBA客户端

本小节通过一个范例展示了开发CORBA客户端的一般步骤。

本节中的范例位于金蝶Apusic应用服务器安装目录中的docs/samples/client/corba目录。有关范例的内容、编译、部署与运行,可参考docs/samples/client/corba目录下的readme.txt文件。

首先开发一个简单的EJB模块,编译并部署到Apusic应用服务器上。

然后使用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客户端的开发,使用了IONA公司的Orbacus产品作为ORB和IDL编译器。可以到www.iona.com下载Orbacus,参考它的说明文档注册并安装,用户可以免费30天试用。注意,使用Orbacus最好在JDK1.3.1下进行开发。编译上一步得到的IDL:

jidl --all
     --output-dir src
     --package idl
     -Iidl -I"D:/JOOC/idl/OB"
     -I"D:/JOOC/idl" ./idl/samples/ejb/Hello.idl
jidl --all
     --output-dir src
     --package idl
     -Iidl -I"D:/JOOC/idl/OB"
     -I"D:/JOOC/idl" ./idl/samples/ejb/HelloHome.idl

其中,“d:\jooc”为Orbacus的安装目录。

开发者根据IDL编译器编译生成的Java文件,提供客户端实现,主程序的代码片断如下:

//设置系统属性,确定使用Orbacus作为ORB
java.util.Properties props = System.getProperties();
props.put("org.omg.CORBA.ORBClass", "com.ooc.CORBA.ORB");
props.put("org.omg.CORBA.ORBSingletonClass","com.ooc.CORBA.ORBSingleton");
props.put("ooc.orb.service.NameService","corbaloc::localhost:6888/NameService");
ORB orb = ORB.init(args, props);

//查找HelloHome,创建Hello,调用方法sayHello()
//注意,使用的CORBA Naming Service定位EJB home接口
System.out.println("Looking up Hello as CORBA object in CORBA naming service");
NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
idl.samples.ejb.HelloHome home = idl.samples.ejb.HelloHomeHelper.narrow(nc.resolve_str("ejb/CORBAClientSample"));
idl.samples.ejb.Hello hello = home.create();

String str = (String) hello.sayHello("apusic,corba client");
System.out.println(str);
System.exit(0);

使用范例程序提供的ant脚本编译并运行客户端。

这个例子只是简单的展示了CORBA客户端能够访问EJB组件的方法,实际上CORBA和EJB的互操作还包含事务和安全的映射,情况比较复杂,因此要求开发者对CORBA规范和开发比较熟悉。而且Java到IDL的映射可能遇到很多问题,例如:ValueType映射,集合的使用等,这就使CORBA客户端访问EJB在很多情况下不能成功。有关EJB和CORBA客户端的开发还可以参考《Enterprise JavaBeansTM Components and CORBA Clients: A Developer Guide 》。