http://www.360doc.com/content/12/0328/15/1369263_198618797.shtml
CORBA(Common Object Request Broker Architecture,公用对象请求代理体系结构)是 Object Management Group (OMG) 协会开发的标准分布式对象体系结构。自 1989 年以来,OMG 的任务就是为开放式软件总线或对象请求代理(Object Request Broker,ORB)提供体系结构规范。以此为基础,不同厂商编写的对象组件可跨过网络和操作系统实现互操作。该标准允许 CORBA 对象相互调用,而无需知道所访问对象的位置或实现被请求对象所用的语言。OMG 指定的接口定义语言(Interface Definition Language,IDL)用于为 CORBA 对象定义接口。
CORBA 对象与典型编程语言对象的不同之处在于:
Java IDL 是同 JDK 1.2 一起提供的对象请求代理。它可与 idltojava
编译器(可从 Java Developer Connection 下载)一起用于定义、实现和访问用 Java 编程语言编写的 CORBA 对象。Java IDL 符合 CORBA/IIOP 2.0 规范 (orbos/97-02-25) 和 IDL-to-Java 语言映射(orbos/98-01-06 终版)标准。
Java IDL ORB 支持瞬态 CORBA 对象 - 该对象的生命期受服务器进程生命期的限制。Java IDL 也提供瞬态名字服务器,以便将对象组织为树型目录结构。名字服务器符合在 CORBAservices:通用对象服务规范中所述的命名服务规范标准。瞬态对象及名字服务器将在下文中讨论。
接口库并不是作为 Java IDL 的组成部分来提供的。由于一般情况下客户机可访问已生成的 stub 文件,因此不需要接口库。
本节引入的概念在 CORBA/IIOP 2.0 规范中有更全面的论述。
下图展示从客户机传送到服务器 CORBA 对象实现的方法请求。客户机是调用 CORBA 对象上某方法的任意代码(其本身也可能是 CORBA 对象)。servant 是对象实现的实例 - 实现该 CORBA 对象的实际代码和数据。
CORBA 对象的客户机具有对该对象的对象引用,并用该对象引用来发出方法请求。如果该服务器对象是远程对象,则对象引用将指向 stub 函数,该函数则使用 ORB 机制向服务器对象传送调用。stub 代码使用 ORB 来标识运行该服务器对象的计算机,并且向该计算机的 ORB 请求与该对象服务器连接。stub 代码取得该连接时,会将对象引用和参数发送到链接目标对象实现的 skeleton 代码。skeleton 代码将该调用和参数变换为所需的、与实现有关的格式,然后调用该对象。任何结果或异常都会沿同一路径返回。
客户机不知 CORBA 对象的位置、实现详情及用来访问该对象的 ORB。不同的 ORB 通过由 OMG 指定的 Internet InterORB 协议 (IIOP) 通讯。[CORBA/IIOP 2.0:ch 9,10]
客户机只能调用在 CORBA 对象接口中指定的方法。CORBA 对象接口通过 OMG 接口定义语言 (IDL) [CORBA/IIOP 2.0 ch3] 进行定义。接口定义对象类型,同时指定一组已命名的方法和参数及这些方法可能返回的异常类型。IDL 编译器(如 idltojava
)可依照相应的 OMG 语言映射将 CORBA 对象定义翻译为指定的编程语言。因此,idltojava
编译器将依照 IDL-Java 语言映射将 IDL 定义翻译为 Java 结构。
idltojava
编译器为每个对象类型都生成 stub 和 skeleton 文件。stub 文件为客户机提供用客户机编程语言表示的对 IDL 定义的方法的访问。服务器 skeleton 文件将对象实现粘合到 ORB 运行时,ORB 使用 skeleton 将方法分配给对象实现实例 (servants)。
开发 CORBA 对象的目的是创建并注册对象服务器或普通服务器。服务器是一个程序,其中包含一个或多个对象类型的实现并注册到 ORB。例如,用户可以开发一个桌面排版服务器,实现“Document”对象类型、“Paragraph”对象类型及其它相关的对象类型。
所有 CORBA 对象都支持定义对象类型的 IDL 接口。一个接口可继承一个或多个其它接口。IDL 语法与 Java 或 C++ 非常相似,CORBA 的 IDL 文件在功能方面与语言无关,类似于 C++ 头文件。将 IDL 映射到每个编程语言后,即可提供从该语言到对象接口的访问。有了 Java IDL,这些 IDL 接口可用 idltojava
编译器翻译为 Java。对于每个 IDL 接口,idltojava 都生成 Java 接口以及其它所需的 .java 文件,包括客户机 stub 和服务器 skeleton。
IDL 接口声明一组客户机可访问的操作、异常及有类型的属性(值)。每个操作都有一个说明定义操作的名称、参数、结果及异常。以下为描述经典“Hello World”程序的简单 IDL 接口。
module HelloApp { interface Hello { string sayHello(); }; };
当出现错误条件时,操作会抛出异常。异常的类型表明了所遇到的错误种类。除正常结果外,客户机还必须准备处理每个操作的已定义异常和 CORBA 标准异常。
一旦定义了 IDL 接口,且 idltojava
编译器基于 .idl
文件运行,就可编写包含方法实现的 .java
文件。而后,.java
实现文件即可被编译并链接到 idltojava
生成的 .java
文件和 ORB 库,以便创建对象服务器。
对象实现将为它所支持的接口的所有操作和属性定义行为。一个接口可能有多个实现(例如每个实现都用来强调特定的时间和空间权衡)。实现定义创建/破坏接口和对象的行为。
由于只有服务器能创建新的 CORBA 对象,因此应为每种对象类型定义并实现工厂对象接口。例如,如果一种对象类型为 Document,则带有 create 方法的 DocumentFactory 对象类型将作为服务器的一部分来定义和实现(注意,“create”不是保留的,可以用任何方法名)。而后,create 方法的实现可用 new
来创建对象。例如:
DocumentServant document = new DocumentServant(): orb.connect(document);
可在 Document 上定义并实现 destroy
方法,或者该对象可无限延续(注意,“destroy”不是保留的,因此可使用任何名称)。
Java IDL ORB 只支持瞬态对象,其生命期受服务器进程生命期的限制。虽然当服务器进程终止运行时瞬态对象也会消失,但该对象的实现可以来将其状态保存到文件中,并在创建时从该文件重新初始化。
客户机代码与 idltojava
生成的 .java 文件和 ORB 库链接。在 Hello World 实例中提供了应用程序和applet客户机的示例。
客户机只可使用服务器提供的已公布工厂接口来创建 CORBA 对象。同样,只有该对象公布一个破坏方法,客户机才能删除 CORBA 对象。由于一个 CORBA 对象可能为网络上的很多客户机所共享,因此,只有对象服务器才能够知道该对象何时成为垃圾。
客户机代码在 CORBA 对象上发送方法请求的唯一方式是经由该对象的对象引用。对象引用是不透明结构,它标识 CORBA 对象的主机、主机服务器监听请求的端口及在进程中指定对象的指针。因为 Java IDL 只支持瞬态对象,所以在服务器进程终止并重启时该对象引用将无效。
客户机一般以如下方式获得对象引用:
一旦获得对象引用,客户机必须将它限定为适当类型。IDL 支持继承,其继承的根目录为 IDL 中的 Object
,即 Java 中的 org.omg.CORBA.Object
(org.omg.CORBA.Object
自然是 java.lang.Object
的子类)。某些操作(特别是名称查询和解串)返回使用 idltojava 编译器生成的帮助类可将其限定为所期望的派生类 org.omg.CORBA.Object
。由于 Java 运行时无法总是知道 CORBA 对象的确切类型,因此必须显式地限定 CORBA 对象类型。
Java IDL Transient Nameservice 是同 Java IDL 一起提供的对象服务器。在命令行提示中使用 tnameserv
可以启动此名字服务器。本对象服务器符合在本页中先前部分所述的标准对象实现及调用技术。
名字服务器通过与文件目录相似的树型结构按名称存储对象引用。客户机可通过名称查找或解析对象引用。因为名字服务器是一种普通的 Java IDL 瞬态服务器,所以每次 tnameserv
终止运行时,整个名称目录结构都会丢失。
有关详细信息,参见命名服务。