Java 版 (精华区)
发信人: angle (finder), 信区: Java
标 题: Java IDL 语言与CORBA接口剖析
发信站: 哈工大紫丁香 (Wed Jun 23 19:58:19 1999), 转信
随着Internet的逐渐兴起,网络中各个模块之间的通信就越发显得重要起
来。Java中提供了CORBA技术,它使Java编写的模块同其它语言编写的模块之间能
够互相通信。 而Java同CORBA之间是通过IDL(接口定义语言)定义的接口相链接
的,在这里,我们对这些接口进行简单的探讨。
一.Java IDL简介
Java IDL是面向分布式对象的一种技术,即通过网络连接的不同平台上的对
象之间的接口技术。Java IDL类似于Java RMI(Remote Method Invocation
)。Java RMI只支持完全用Java语言编写的分布式对象之间的通信,而Java IDL
可以使对象之间互相通信而不管它们是用Java语言编写还是用C、C++、COBOL、
Ada、Smalltalk等其它语言编写的。
由于Java IDL是基于CORBA(Common Object Request Brokerage
Architecture)分布式对象工业模型设计的,因此,它使得各种不同语言编写的
模块之间进行通信成为可能。CORBA的关键特性是IDL(接口定义语言)。每一种
支持CORBA的语言都有它自己的IDL接口映射。Java IDL支持CORBA到Java的映
射。CORBA和IDL都是工业协会OMG(Object Management Group)的标准,SUN公
司也是OMG的一员,因此有一个Java IDL组专门负责IDL到Java的接口映射。Java
IDL提供ORB(Object Request Broker)来支持不同程序之间的交互通信,ORB是
一组支持Java IDL应用程序和其它CORBA支持程序之间进行底层通信的类库。
二. CORBA的结构
任何相关的分布式对象都有两个方面:客户端/服务器端。服务器端提供远程
通信的接口,客户端调用这些远程接口。这是分布式对象最为普遍的工作模式,包
括Java RMI和CORBA。在这里,客户/服务器的交互通信是面向对象级而不是面向
应用级设计的。实际上,一个单一对象可以成为远程对象所提供的接口的客户,同
时,它也可以执行其他远程对象调用的接口程序。下图说明了分布式对象被CORBA
客户调用和服务器执行程序方法的过程。
点击插图
图一 CORBA结构
在客户端,应用程序包括一个指向远程对象的引用。对象引用有一个存根方
法,它支持远程调用。存根方法实际上是链入ORB类库,因此,调用它时会产生链
接信息,提交请求到服务器端。
在服务器端,ORB使用一种纲要代码把远程请求翻译成调用本地对象的方法。
这种纲要转录把调用和参数翻译成本地执行的详尽格式。当本地方法运行返回时,
纲要转录又会翻译运行结果和错误,通过ORB传输回客户端。
在ORB之间,通信是通过IIOP(Internet Inter ORB Protocol)协议服务
器的。它是基于TCP/IP的网际协议的,定义了遵循CORBA的ORB怎样向前和向后传
送信息。同CORBA和IDL一样,IIOP协议标准由OMG定义。
除了提供简单的分布式对象交互能力之外,遵循CORBA的ORB还能提供由OMG定
义的一些可选功能,包括按照名称查找对象、保持持续性的对象、支持事物处理、
支持消息传送、分布式计算环境等等一些分布式环境的应用。一些厂商提供的Java
ORB可以支持上述所有的功能,但Java IDL提供的ORB只支持按照名称锁定对象的
功能。
三. 编写IDL接口文件
下面以经典的Hello World程序为例,编写IDL接口文件来分析Java IDL到
CORBA的接口结构。这个程序十分简单,它只包括一个接口和一个操作。
第一步:定义CORBA IDL模块
CORBA模块是一个包含相关接口和定义的容器。它同Java Package包相对应。
在IDL文件中定义的每一个模块都对应一个Java Package语句。
首先,利用任意一个文本编辑器创建一个Hello.idl文件;然后,在其中输入
以下模块语句代码:
module HelloWorld
{
//加入其它代码
};
在运行idltojava程序编译这个文件后,将产生Java文件的package语句。
第二步:定义接口
与Java语言的Interface语句一样,CORBA中的接口语句也表明对象之间的链
接。在映射过程中,每个CORBA接口映射一个Java接口。编译后,在客户端和服务
器端可以通过不同的方式实现和调用。
Module HelloWorld
{
interface Hello
{
//加入方法定义语句
};
};
第三步:定义操作
CORBA中定义的操作是在服务器端实现的,同时是由客户端来调用触发它。每
个操作语句都对应Java接口中的一个方法。
Module HelloWorld
{
interface Hello
{
string sayHello();//方法
};
};
四. 分析从IDL文件Hello.idl到Java文件的映射
idltojava应用程序读入OMG IDL文件来创建需要的Java文件。它缺省设置了
客户端和服务器端的两部分程序。而用户只需要简单地键入IDL文件名即可。例
如:
idltojava Hello.idl
如果现在显示目录中的内容,就会发现系统自动创建的HelloWorld目录,该
目录中共有五个文件。打开其中的Hello.java文件,你会发现它的形式如下:
/* Hello.java as generated by idltojava */
package HelloApp;
public interface Hello
extends org.omg.CORBA.Object
{
String sayHello();
}
通过分析这个例子,我们可以看出IDL语句是怎样映射产生Java语句的。
IDL语句 Java语句
Module HelloApp; package HelloApp;
Interface Hello; public interface Hello;
String sayHello(); String sayHello();
值得注意的是,所有的CORBA对象都是由org.omg.CORBA.Object导出,用来
支持CORBA的基本功能。这些都由idltojava程序生成,用户不需要做任何手工映
射。
六.分析idltojava编译的输出
经过idltojava编译后的IDL文件产生了五个文件,一般用户会忽略它们。这
些文件的数目可以由编译选项来控制。它们提供了对CORBA基本功能的支持。这五
个程序是:
* _HelloImplBase.java: 这是一个抽象类,是服务器端的纲要程序,提供
对服务器端的CORBA基本功能的支持。它继承idltojava创建的Hello.java接口。
服务器端的程序应该继承这个类。
* _HelloStub.java: 这是一个客户端存根,提供对CORBA客户端的基本功能
支持。它也继承idltojava创建的Hello.java接口。
* Hello.java: 这个接口程序是经过转换而成的Java版本的IDL接口,它包
含我们刚才设计的唯一的方法sayHello();它继承org.omg.CORBA.Object类,提
供对标准CORBA对象的支持。
* HelloHelper.java: 这个类主要提供一些辅助功能,主要处理把对CORBA
对象的引用对照成一些合适的方式的精细方法。
* HelloHolder.java: 这个类支持Hello类型的公有型事例,它提供对输入
输出参数的操作。它们是CORBA所支持的,但从语法上却不能直接映射为Java语言
的一些操作。
通过以上的分析,就可以很清楚地了解Java IDL语言和CORBA接口的映射关系
了,这对我们进行分布式对象的Java编程以及对CORBA的调用很有帮助。
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: www-post@bbs.hit.edu]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.552毫秒