对象:一个CORBA编程实体,由一个标识符、一个接口和一个实现组成。对象也被称作仆人(Servant),也叫做代理。
对象引用:一个强类型的不透明句柄,用于标示一个对象的位置,即IOR。
客户:对对象实现的接口进行调用的程序实体。
通过一个对象引用对其发送请求。
对象请求中介(ORB):提供一种机制实现客户和对象之间的请求的透明传递。对于分布式程序而言,它使得客户像调用本地函数一样调用远程函数。
ORB接口:一个ORB是一个可以被多种方式实现的逻辑实体。为了把应用的从实现细节中分离出来,CORBA规格对每个ORB定义了一个抽象接口。这个接口提供了一些有用的工具函数,例如把一个对象的引用转换成字符串。
说具体一点,一个CORBA接口就像一个纯虚的C++类。它没有任何数据成员,没有任何protected或private成员,所有的函数都是public且纯虚的。
CORBA IDL stubs and skeletons:它们像胶一样把客户端和服务应用程序分别和ORB粘起来。这些通常是由CORBA IDL编译器完成的。
动态调用接口(DII):这个接口允许客户端直接访问由ORB提供的底层请求机制。
动态Skeleton接口:这个就相当于服务器端的(DII)。
对象适配器:它帮助ORB把请求传递给对象,并且激活该对象。更重要的是,对象适配器将对象的实现和ORB联系起来。
OMG接口上的每一个操作必须具有:
1、一个名字
2、一个返回类型,可以为void
3、0个或多个参数
同时它还可以可选的含有:
1、一个raises语句,标明这个操作可能会引发哪些异常。
2、一个oneway修饰符,标明调用者不期望得到任何结果 (一般不要使用)
3、一个context语句。(这个是过时的且不可移植的,不该再被使用)
另外,操作不支持重载。
IDL到C++的映射规则:
1、每个module(模块)被映射到一个namespace或者class
2、每个interface被映射到一个class
3、每个操作被映射到c++中的一个方法
4、每个属性被映射成一对 get/set 方法
CORBA的基本设计原则:
1、将接口与实现相分离
2、位置透明。服务的使用和服务的位置是不相关的。
3、访问透明。直接通过对象执行调用。
4、类型化的接口。
5、接口支持多继承。
CORBA/C++中的参数传递:
1、内置的传入类型参数,例如,char,long,按值传
2、用户定义的传入参数,例如struct/class,按常量引用传递
3、字符串使用const char*传递
4、inout类型的参数使用引用传
5、定长的out类型参数和返回值使用引用传递
6、变长的out类型参数和返回值动态分配
7、对象引用型out参数和返回值被复制一份。
对象引用:
一个对象引用是一个强类型的不透明句柄,指向接口的一个实例。
它具有以下语义:
1、每个对象引用精确的指向一个对象实例(一个,并且只能是一个)。
一个对象可以有多个引用。
2、引用可以为空。(即,不指向任何实例,就像C++中的空指针那样)
3、引用可以指向一个已经被销毁的实例。
4、引用是不透明的,客户不允许察看它们的内容
5、引用是强类型的
6、引用支持延迟绑定
7、引用可以被持久化
8、引用之间可以彼此协作。
所有的IDL接口都隐式的继承自一个名为Object的接口。
当客户通过一个对象引用执行一个操作的时候,ORB执行以下步骤:
1、定位到目标对象
2、如果服务进程并没有正在运行中,激活服务程序
3、如果需要传递参数,将该调用的所有参数传递给对象
4、如果需要的话,为该对象激活一个servant。
5、等待请求完成
6、当请求完成后,将需要返回的数据(out类型的参数和返回值)返回给客户。
7、如果操作失败,返回一个异常。
对象引用内部实现:
它主要包含以下三种内容
1、Repository ID。用于标示一个IOR类型。
2、Endpoint Info。所有的,ORB所需的,用于建立一个到server所实现的对象的物理连接的所有信息。
3、Object key。用于标示一个对象。
开发一个CORBA应用的步骤:
1、决定应用的对象,然后把它们的接口用IDL描述出来
2、运行IDL编译器,生成所需的文件。
3、声明并实现各个C++ servant类。
4、写好server的主函数,并编译,链接。
5、实现客户端。
CORBA Event Service:
生产者产生事件(event),消费者接收事件。生产者和消费者之间使用event channel来联系。
OMG Event Service提供两种event投递模型,push和pull。即主动投递或被动获取。生产者和消费者都可以各自是主动的或者被动的。于是就有了2*2=4种模式。或者也可以采用混合模式,即有的消费者是主动的,有的消费者是被动的…
PushSupplier主动的推送事件。
PushConsumer被动的接收事件,当它不希望再接收的时候,调用disconnect。
当一个supplier不再希望发送事件的时候,它调用disconnect_push_consumer方法,以断开所有Consumer。
阅读(713) | 评论(0) | 转发(0) |