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;
本小节通过一个范例展示了开发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 》。