(本文转载自软件工程专家网www.21cmm.com)
苏洋
9. 接口的继承
与C++和Java中类的继承类似,OMG IDL中关于接口的继承分为两种类型:
● 单继承: 一个接口继承另一个接口的属性及方法特征;
● 多继承: 一个接口继承两个或两个以上接口的属性及方法特征。
用继承关系编写接口定义时,如果在接口定义之前该接口的父接口没有定义,则需要在定义接口之前先声明父接口,即所谓的前置声明(Forward Declaration)。下面举例说明接口继承。
在前一讲中,曾定义了人力资源管理接口JobManager,由于实际需要,还要根据该接口定义资源服务接口,而该接口应继承管理接口的特征。因此,以管理接口为父对象定义新的接口JobServer:
interface JobServer : JobManager
{ void MailToManager( in long ManagerId, out string status); }
JobServer : JobManager表明接口JobServer继承JobManager的对象特征。
上例中仅说明了单继承类型,多继承需要用逗号将被继承的类分开,如:
interface JobCenter : JobServer,JobManager { }
10. 异常处理(Exception)
与C++和Java的语法规则类似,CORBA同样提供了异常处理机制,称为“引发异常”(Raising an Exception)。CORBA本身定义了一部分由调用请求或ORB传递引发的异常,称为系统异常(有关CORBA系统异常请查阅相关资料)。因此,在OMG IDL中定义的异常通常称为“自定义异常”。
OMG IDL中用Exception关键字定义用户异常,在定义的方法后面加上raise关键字来声明,如果符合异常的触发条件,则引发定义类型的异常。如下例所示:
enum ErrorStatus {Fatal,Important,Slight,NoMeaning};
Exception ReasonOfMail
{ ErrorStatus status; }
interface JobManager
{ string QueryJobStatus( in long Number, out string property)
raises (ReasonOfMail);}
11.定义方法传递的上下文
在前面几讲中,曾提到过上下文,上下文在接口定义的方法中是如何传递的呢?上下文对象中包括一个称为特征名-特征值的名值对,在方法中使用context关键字定义。ORB在每次客户机发出调用请求时,在对象实现中匹配特征值。如下例所示:
string QueryJobStatus( in long Number, out string property)
raise(ReasonOfMail) context(“who”);
按照以上定义,执行QueryJobStatus方法时,ORB在服务对象实现端的上下文序列中匹配特征名为“who”的特征值。
ORB互操作体系结构
ORB的互操作性(InterOperability)体现在分布于网络中的多个对象借助Internet ORB间协议(IIOP)和通用ORB间协议(GIOP),达到不同厂商ORB之间操作的一致性。
具体来说,ORB互操作是指对于两个独立开发的ORB,一个ORB中的客户端应用可以调用在另外一个ORB中利用OMG IDL定义的服务对象实现的方法。实现互操作的基本条件有:
● 多厂商ORB之间不需要预先知道对方的实现细节;
● 每个ORB必须实现其规范中定义的全部内容;
● 保留每个ORB独立服务的实现。
ORB间互操作能力的实现,极大地丰富了分布式程序设计思想的内涵,使得构建基于整个互联网的分布式应用成为可能。
通过在CORBA中引入内联桥接(In-line Bridging)和请求级桥接(Request-level Bridging), 使ORB在不需要了解对方ORB实现细节的情况下,就可以实现ORB间的互操作。
上面两种ORB间的桥接方式只是说明了ORB间相互发送请求时的虚拟连接方式。为了实现ORB间的通信,在CORBA规范中定义了两种用于在不同厂商ORB间进行通信的协议,即通用ORB间互操作协议(General Inter_ORB Protocol ,GIOP)和环境相关的ORB间互操作协议(Environment-Specific Inter-ORB Protocol,ESIOP)。这两种协议屏蔽了操作系统类型、实现语言以及具体厂商等因素。只要ORB支持该协议,就能够在不同的ORB之间实现通信。
1.通用ORB间互操作协议(GIOP)
CORBA中定义的一种面向连接的互操作协议为通用ORB间互操作协议(General Inter_ORB Protocol ,GIOP)。在CORBA规范中,该协议只是一个框架,给用户在具体实现过程中留下了充足的空间。GIOP规范包括如下内容:
● 公共数据表示(Common Data Representation,CDR)的定义:该数据定义用于将OMG IDL数据类型映射为ORB之间的桥接(Bridge)可以理解的二进制数据类型。
● GIOP消息:在CORBA规范中定义了用于实现ORB之间通信的七种类型的消息,它们分别是: 请求(Request)、响应(Reply)、请求取消(RequestCancel)、请求定位(LocateRequest)、响应定位(LocateReply)、连接关闭(CloseConnection)和消息错误(MessageError)。
通过定义这些消息,使得除了能够在不同的ORB间支持CORBA规范中定义的全部功能外,还能够支持对象实现的定位、对象的动态激活和通信资源的动态管理。
● GIOP消息传递: GIOP消息传递用于规范在网络中传递应用数据和GIOP消息的方式。GIOP消息传递具有如下特点:面向连接,保持字节流的传输顺序,确保可靠传输,传输内容的长度无关,达到TCP/IP协议规范的初始化性能等。
GIOP互操作协议规范了在网络中实现ORB互操作的方式。GIOP协议还有相对于具体的网络协议类型的镜像,最典型的就是GIOP在TCP/IP协议中的实现: 基于Internet的ORB间协议(Internet Inter-ORB Protocol,IIOP)。IIOP规范继承了GIOP规范的全部内容,并且增加了如下要素:
● 打开TCP/IP连接的方式;
● 利用连接实现GIOP消息传递的方式。
可以这样理解IIOP协议:在遵守GIOP中关于公共数据表示和消息格式定义的前提下,以TCP/IP协议为实现蓝本,具体化GIOP消息的传递方式。
2.环境相关的ORB互操作协议
CORBA规范中定义的另外一种ORB间的互操作协议是环境相关的ORB间互操作协议(Environment-Specific Inter-ORB Protocol,ESIOP),该协议规范了在具体的应用环境中实现ORB间互操作的方式。由于该协议与分布式应用环境有着密切的关系,使得该协议在不同的实现和应用方式方面具有较大的变化,因此称基于ESIOP的特定环境协议为环境相关的ORB互操作协议族。
ESIOP协议中最具代表性的、同时也是在CORBA规范中明确说明了的是分布式计算环境中公共ORB互操作协议(Distributed Computing Environment Common Inter-ORB Protocol,DCE-CIOP)。在该协议中,数据的表示方式与前面讲述GIOP协议完全相同,但是在消息的定义以及传递方式中,采用的是远程方法调用(Remote Procedure Call,RPC)中的Locate和Invoke方法实现消息以参数形式传递,进而实现ORB间的互操作。