摘要:本文通过一个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语言的广泛使用,这方面的应用和研究将会不断深入。
闽公网安备 35060202000074号