2.3.1 ORB结构
图 2-4 通过ORB传递请求
图2-4显示了一个client向对象实现发送一个请求。Client是一个想对对象进行操作的一个实体,对象实体是实现对象的代码和数据。ORB负责根据一个请求来定位一个对象,安排对象实现准备接受请求,与请求的数据通讯。Client的接口与对象的位置完全,实现对象的语言及其它不在对象接口反映出来的方面等无关。
图2-5显示了单个ORB的结构。用斜条文的矩形框表示ORB的接口, 箭头表示调用ORB或ORB使用接口把信息向上传递。
图 2-5 ORB接口结构
Clinet使用Dynamic Invocation interface (与目标对象的接口无关)或OMG IDL stub (与目标对象接口有关的stub)来发出请求。由于某种原因,Client也可以直接与ORB联系。对象实现使用OMG IDL生成的skeleton或动态 skeleton以向上传送(up-call)的方式接受请求。对象实现也可以调用Object Adapter和ORB。可以用两种方式来定义对象接口:一是用OMG Interface Definition Language (OMG IDL)来定义接口。该语言根据可能对对象进行的操作和这些操作使用的参数来定义对象类型。第二种方法是,把接口(interface)放入Interface Repository service中; 该服务把接口中的元素描述成一个对象。任何能实现ORB的软件中,Interface Definition Language (可能根据文档的内容而改变)和Interface Repository具有相同的作用。一个client要使用Object Reference完成请求,它必须知道对象的类型的及具体的操作。Client初始化请求有两种方法,一是通过调用目标对象的stub routines,二是动态的创造请求(如图2-6所示)。
图 2-6 Client使用Stub 或Dynamic Invocation Interface
不论使用Stub还是Dynamic Invocation Interface来发出请求具有相同的语义,信息的接收者不能分辨出该请求是使用哪种方法来传递的。ORB确定适当的实现代码,传递参数,通过IDL skeleton或dynamic skeleton (如图Figure 2-7 所示)把控制传给Object Implementation。每一个接口和object adapter 使用不同的Skeletons。为了完成请求,object implementation 可能通过Object Adapter 使用来自ORB的服务。当完成请求后,控制和输出结果返回给client。
图 2-7 Object Implementation 接受请求
Object Implementation选择使用何种Object Adapter。它是根据Object Implementation 需要服务的种类来确定的。图2-7 显示了clients和object implementations如何使用接口和实现信息。用OMG IDL或Interface Repository来定义接口;该定义用于产生client Stubs和object implementation Skeletons。
图 2-8 Interface 和 Implementation Repositories
在安装时把object implementation 信息放入Implementation Repository中,以备请求使用。
2.3.2 ORB结构中的主要构件
图2-9CORBA ORB结构
Object Implementation(对象实现): 它定义了实现一个CORBA IDL接口的操作。它可以用各种语言来写,如C, C++, Java, Smalltalk和Ada。
图2-10 典型的Object Implementation 结构Client(客户): 这是一个程序实体,它调用了某一个对象实现中操作。对调用这来讲,访问远程对象server应该是透明的。它应该和调用对象中的方法一样简单,如,obj->op(args)。
Client只能根据对象的接口了解对象的逻辑结构,虽然,我们一般都把client看作是一个程序或一个进程,但是,知道一个client都是某一个对象有关的。例如,一个对象的实现可能是其他对象的client。
图 2-11 典型的Client结构Client通过语言映射(language mapping)来使用对象和ORB 接口。当这种映射关系改变时,不需要改变Client。Client不需要了解对象的实现方式,对象适配器及ORB。
Object Request Broker(ORB):
ORB提供了一种机制,能实现client请求与目标对象实现之间的透明通信。它使得client请求就象一个本地过程调用一样。当一个client引用一个操作,ORB负责找到对象实现,如果需要则透明的激活它,然后把该请求递交给该对象,最后返回应答给调用者。实现时,可以把ORB不作为单个成分,但它只能由它的接口来定义。任何ORB实现方式提供的接口都是可以接受的。可以把接口中的操作分为三类:
1. 对于所有的ORB实现都一样的操作
2. 特定类型对象的操作
3. 与对象实现种特定类别有关的操作
不同的ORB有不同的实现方式,但都包括有:IDL 编译器, 仓库(repositories),各种Object Adapters,给client提供各种服务集,具有不同属性的对象实现等。
现在有各种不同的ORB实现。一个client可以同时访问两个由不同ORB实现管理的对象引用(object references)当这两个ORB需要一起工作时,它们能区分出各自的对象引用。Client不需要对此负责。ORB Core是ORB的一个组成部分,它提供对象的基本表示和与请求的通信。
有四种不同类型的ORB:
1.Client- and Implementation-resident ORB
2.Server-based ORB
3.System-based ORB
4.Library-based ORB
ORB Interface:
一个ORB是一个逻辑实体(logical entity),它可以用各种方法实现(如一个或多个过程,或一个libraries集合)。为了减轻编写程序的困难,CORBA规范定义了一个抽象的接口。该接口提供各种帮助函数。
CORBA IDL stubs and skeletons:
它相当于client、server应用程序和ORB之间的“胶水”。由CORBA IDL编译器自动实现CORBA IDL定义与目标编程语言之间的转换。
使用编译器可以减少client stub和server skeletons之间的潜在矛盾。
Dynamic Invocation Interface(DII):
该接口允许client直接调用ORB所提供得最底层的请求机制。应用程序使用DII动态地把请求传给对象而不需要IDL接口(包括特定stub)。与IDL stub(它只允许RPC模式的请求)不同,DII也允许clients使用无块的延迟同步调用(non-blocking deferred synchronous)(发送操作是独立的)和单向调用(send-only)。
Dynamic Skeleton Interface(DSI):
与client端的DII类似的,位于server端的接口。DSI允许ORB把请求发送给对象实现,该对象实现不包含编译时所需要的类型。发出请求的client不知道该实现是使用指定类型的IDL skeletons 还是使用动态的skeletons。
Object Adapter:
它帮助ORB把请求传给对象并激活该对象。更重要的是一个object adapter总是与一个对象实现(object implementations)联系的。Object adapter可以被定义来支持特定的对象实现类型(如OODBobject adapters用于持续对象(persistence)而library object adapters 用于非远程对象)。
图2-12 典型的Object Adapter结构它的作用有:
(1)产生和解释对象引用
(2)Method调用
(3)相互作用的安全性
(4)对象和激活实现及撤销实现
(5)把对象引用映射到相应的对象实现
(6)注册对象实现