摘要:本文通过一个JCORBA应用实例,介绍了JCORBA的特点和如何在Oracle 应用服务器中部署Java CORBA构件。
关键词:Oracle,CORBA,JCORBA,构件,Java
Internet的迅速发展改变了传统的信息交流方式和企业的运行方式,它已经成为许多新兴产业如电子商务、自助服务、网上购物和在线交易的媒介。越来越多的企业通过Internet构筑起自己企业的信息应用平台,而JAVA语言以其易用性、跨平台性、面向对象性等诸多优点,正随着这股潮流成为面向企业应用和Internet应用的流行网络计算语言。许多企业正在将他们的商业应用如电子商务用JAVA来实现,为了适应这种需求,Oracle公司推出其应用服务器产品OAS 4.0(Oracle Application Server Version 4.0),它将Java虚拟机(Virtual Machine)内置于 OAS4.0中,采用称为Java加速器的自然编译方法,将Java库程序先编译为标准的C代码,再将C代码在不同的CPU和操作系统的平台上进行编译,生成共享库供Java程序调用,这种方式大大提高了Java程序的执行速度。
在OAS4.0中,Java应用有多种实现形式,其中以JCORBA(Java CORBA, 简写为JCO)以其灵活的客户端调用,符合CORBA 2.0而广受关注,同其它的一些CORBA实现平台一样,JCORBA构件在OAS 4.0中实现时,也融入了 Oracle一些自有的特点,下面通过介绍JCORBA应用实例"myStack"的开发过程,向大家介绍JCORBA的特点、开发和使用过程。
一、 JCORBA开发工具
开发JCORBA,你可以使用任何支持JAVA 1.1.4或以后版本的JAVA开发平台进行开发,如Oracle 公司Jdeveloper、SUN公司的JDK、BORLAND 公司的Jbuilder等。在本实例中我们使用 SUN 公司的JDK 1.1.5。
二、 建立开发环境文件目录
在建立JCORBA应用以前,建议建立固定格式的目录结构,这样有利于对整个JCORBA应用进行管理,图1 的目录结构已指明了实例中各文件的相应位置,相应的文件在以后的工作不断加入。
三、 建立目标应用程序
目标应用程序包括一个类,其类名为ServerStack,它能实现简单的栈操作,这个类可实现如下四个方法。
setStackSize() 设置栈的长度 getStackSize() 获取栈的长度 push() 压栈 pop() 从栈中弹出数据
在这个类中,还提供了有关生命期的处理。
ServerStack.java源代码如下:
package myStack; import oracle.oas.jco.*; import java.util.Properties; public class ServerStack implements Lifecycle { private int stackSize = 0; private String stackElements[]; private int top = -1; private ObjectManager mgr = null; private Logger logger = null; public void jcoCreate() { mgr = ObjectManager.getObjectManager(this); logger = mgr.getLogger(); logger.setSeverity(Logger.LOG_SEVERITY_DEBUG); try { Properties env = mgr.getEnvironment(); setStackSize(Integer.parseInt(env.getProperty("initialStackSize"))); } catch (Exception e) { } } public void jcoDestroy() { } public void jcoPassivate() throws NonReusableException { throw new NonReusableException(); } public void jcoActivate() { } public int getStackSize() { logger.println(" Getting stack size..."); return stackSize; } public void setStackSize(int size) throws StackException { if (size < 0) throw new StackException(); logger.println(" Setting stack size to " + size + "..."); top = -1; stackSize = size; stackElements = new String[size]; } public void push(String value) throws StackException { if (top == stackSize - 1) throw new StackException(); logger.println(" Pushing \"" + value + "\" onto the stack..."); stackElements[++top] = value; } public String pop() throws StackException { if (top == -1) throw new StackException(); logger.println(" Popping the stack (returning element " + stackElements[top] + ")..."); return stackElements[top--]; } }
四、 建立远程调用接口
为了使客户端能调用ServerStack中的方法,必须要有相应的接口程序,在接口程序中,应包含客户端所能调用的所有方法,接口程序的程序名为ServerStackRemote.java。程序源代码如下:
package myStack; public interface ServerStackRemote extends oracle.oas.jco.JCORemote { public int getStackSize(); public void setStackSize(int size) throws StackException; public void push(String value) throws StackException; public String pop() throws StackException; }
五、 建立异常处理
在ServerStack中,能够响应异常处理,为了处理异常,编制相应的异常处理类,其程序名为 StackException.java。程序源代码如下:
package myStack; public final class StackException extends Exception { public StackException() { } }
六、 编译JAVA源代码
将上面的三个JAVA程序,ServerStack.java, ServerStackRemote.java, StackException.java,复制到第二节所示的目录结构中。在你进行编译前,检查你的CLASSPATH环境是否包括如下路径和文件:
$ORAWEB_HOME/jco/lib/jcort.jar
$ORAWEB_HOME/classes/wrbjidl.jar
$ORAWEB_HOME/classes/services.jar
如果用JDK时编译,命令行如下:
prompt>cd ..\Stack\src\MyStack prompt>javac -d .. \Stack\classes_svr\myStack *.java
编译完成。
".."表示目录"Stack"所在的目录前缀。
七、 建立配置文件
JCORBA应用配置文件名必须为JCO.APP,文件中包含应用程序名,远程接口名及其它系统参数的设置值和初始值。其文件内容如下:
[APPLICATION] name=myStack_JCO [ServerStack] className=myStack.ServerStack remoteInterface=myStack.ServerStackRemote [ServerStack.ENV] initialStackSize=20
八、 为应用建立JAR文件
JAR文件中将包含所有建立JCORBA应用所必须的文件,Oracle应用服务器管理程序将从中得到建立JCORBA应用所需的所有资料,并将它们安装在应用服务器相应的位置,我们可以运行JDK中的JAR实用程序来进行该项工作。命令行如下:
prompt>cd ..\Stack\classes_svr prompt>jar cvf Server.jar ..\Stack\classes_svr\myStack\*.class META-INF
产生的JAR文件Server.jar在其相应的目录结构中。
九、 将JCORBA应用安装到应用服务器中
按OAS4.0管理程序的要求和安装步骤,将Server.jar安装到应用服务器中,其整个安装过程相当简单,但按装时也应注意如下几点。
Application Type: "JCORBA" Configure Mode select: "From File" Display Name: "StackApp" Jar File: "Server.jar"
安装完成以后,如要使用该应用,应启动它。
十、 建立客户端应用
JCORBA的客户端可以有多种形式,主要如下:
浏览器端的 Java Applets 其它的JCORBA应用 Java应用程序 Jweb 插件 LiveHTML插件 Per1插件
正由于有众多的客户程序类型可以调用JCORBA,大大拓展了JCORBA的应用范围,提高了JCORBA重用性和使用的方便性。为了实例介绍的方便性,我们选择了Java应用程序作为其客户端实例。
客户端Java程序源代码如下:
import oracle.oas.jco.*; import oracle.oas.jndi.*; import oracle.oas.jndi.oas.*; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.util.Hashtable; import javax.naming.*; import myStack.ServerStackRemote; public class StackClient { public static void main(String args[]) { int stackSize; String buf, stackElement; int n = 0; String _host = "localhost"; ServerStackRemote s = null; try { String _urlStr = args[0]; if (_urlStr != null) { URL _contactURL = new URL(_urlStr); _host = _contactURL.getHost(); int _port = _contactURL.getPort(); if (_port != -1) _host = _host + ":" + String.valueOf(_port); } Hashtable _env = new Hashtable(); _env.put(Context.URL_PKG_PREFIXES, "oracle.oas.jndi"); // Initial Context Context _initialContext = new InitialContext(_env); // Lookup String _name = "oas://" + _host + "/myStack/ServerStack"; s = (ServerStackRemote) _initialContext.lookup(_name); System.out.println(); System.out.print("Enter server stack size: "); BufferedReader d = new BufferedReader( new InputStreamReader(System.in)); buf = d.readLine(); stackSize = Integer.parseInt(buf); s.setStackSize(stackSize); System.out.println("---> Server stack size is currently " + s.getStackSize()); for(n = 0;;n++) { System.out.print("Enter stack element (RET to quit): "); stackElement = d.readLine(); if (stackElement.length() == 0) break; s.push(stackElement); }
System.out.println("---> Server stack currently has the following " + n + " elements:"); System.out.println(); for (int i = n-1; i >= 0; i--) System.out.println(" " + s.pop()); } // end try catch (myStack.StackException se) { System.out.println("Stack exception occurred."); System.out.println(se); } catch (java.io.IOException ioe) { System.out.println("The following error occurred while trying to read input."); System.out.println(ioe); } catch (NamingException ne) { System.out.print("Communication error: "); System.out.println(ne.getMessage()); ne.printStackTrace(); } finally { if (s != null) s.destroy(); // from JCORemote } System.exit(0); } }
为了使客户端和服务器建立连接,还需将ServerStackRemote.class和StackException.class 复制到 ..\Stack\classes_cnt\myStack目录之下。
编译 StackClient.java 为 StackClient.class,并按第七节的方式产生客户端的JAR文件,JDK命令行如下:
prompt>javac -d ..\Stack\classes_cnt\myStack StackClient.java prompt>cd ..\Stack\classes_cnt prompt>jar cvf client.jar ..\Stack\classes_cnt\myStack\*.class
客户端JAR文件产生完成。
十一、 运行客户端程序调用JCORBA应用
至此,我们终于可以运行我们的JCORBA应用了,命令行如下:
prompt> java StackClient http://appservermachine:port appservermachine:port:运行OAS的机器名和其运行端口。如果机器名为Oracle,端口号为80,我们键入如下命今行和其运行实例如下:
prompt> java StackClient http://oracle:80
Enter server stack size: 4
---> Server stack size is currently 4
Enter stack element (RET to quit): 1 Enter stack element (RET to quit): 2 Enter stack element (RET to quit): 3 Enter stack element (RET to quit): 4 Enter stack element (RET to quit):
---> Server stack currently has the following 4 elements:
4 3 2 1
十二、 结束语
通过对"myStack"应用实例开发过程的介绍,给出了OAS4.0中JCORBA 应用的实现框架。随着CORBA构件技术的不断发展,JAVA语言的广泛使用,这方面的应用和研究将会不断深入。
|