middleware3

典型的CORBA应用实现过程:

用IDL编写对象规格说明--->编译IDL生成桩和框架    
    --->编写对象实现和服务程序代码--->编译服务程序--->运行服务程序          
    --->编写客户程序代码--->编译客户程序--->运行客户程序            
--->启动对象请求代理(ORB)内核

IDL语言

说明性语言,定义组件接口,不定义实现。
语法上可以看成C++的一个子集,规定组件的属性、所继承的父类、产生的异常、事件和各类数据类型。
编译器作用:将IDL映射到具体程序设计语言,产生桩代码和框架代码
调用请求经客户端桩传递给ORB,然后转发到服务端框架,最后到达真正要执行请求的对象实现实例

编写对象实现和服务程序

  • 对象实现可用各种语言实现,且与客户程序的语言无关
  • IDL到编程语言的映射规则
    • 生成IDL框架代码和各种辅助性的java接口或类
    • 编写对象实现代码时必须继承或使用其中的某些接口或类
  • 服务程序
    • 利用POA激活伺服对象供客户对象使用
    • 通常是一个循环执行的进程,不断监听客户程序请求并为之服务

      对象适配器

      作用:
  • 管理服务器端伺服对象,对象标识,CORBA对象以及它们之间关联的主要工具是对象适配器
  • 决定在收到一个客户请求时应调用哪一个伺服对象,然后调用该伺服对象上的合适操作
  • POA的可移植性指建立在POA基础上的服务端程序不依赖于特定的ORB产品,从而在不同ORB产品之间是可移植的

CORBA对象与伺服对象

CORBA对象与具体的伺服对象是两个不同抽象层次的概念:

  • 它们之间的彻底分离使得CORBA独立于任何特定程序设计语言,并为服务端程序的可移植性打下基础。对象适配器(object adapter)是一个重要的ORB组件,它负责将抽象的CORBA对象映射到具体的伺服对象。

CORBA对象可看作是一个具有对象标识、对象接口及对象实现的抽象实体。

  • 之所以称为抽象的,是因为并没有硬性规定CORBA对象的实现机制。由于独立于程序设计语言和特定ORB产品,一个CORBA对象的引用又称可互操作的对象引用(Interoperable Object Reference)。从客户程序的角度看,IOR中包含了对象的标识、接口类型及其他信息以查找对象实现。

伺服对象(servant)是指具体程序设计语言的对象或实体,通常存在于一个服务程序进程之中。

对象标识(Object ID)是一个用于在POA中标识一个CORBA对象的字符串。

伺服对象通过对象标识关联到CORBA对象。

持久对象(persistent object)可在创建它的服务程序进程之外存在,瞬时对象(transient object)只能在创建它的服务程序进程中存在。它们都是指一个CORBA对象

客户请求的传递过程

  • 客户程序发出的请求中包含:创建对象引用的POA名字、对象标识及目标机器与端口等信息。
    • 如果目标POA不存在,ORB还允许调用适配器激活器创建所需的POA。
  • 一旦请求被ORB传送到正确的机器与端口,监听该端口的POA管理器负责检查对象关键码(object key),对象关键码中含有POA名字与对象标识;
  • POA管理器利用对象关键码将请求传送给正确的POA
  • POA利用对象关键码确定对象标识,
  • 根据POA的策略集直接或间接地利用对象标识将请求传送到正确的伺服对象。
  1. 客户程序向ORB发出请求
  2. ORB根据其中的目标机器和端口信息将请求发送到指定端口
  3. POA管理器根据请求中的POA名字将请求发送到特定的POA
  4. POA根据对象标识将请求传到正确的伺服对象

为什么要有多个POA,如果只有一个的话,也不需要什么管理器了?

  • POA层次

    即每个POA都有一个父POA,所有POA都是根POA的后代。每个ORB在创建时都自动带有一个根POA,可根据需要从根POA创建其他子POA。

  • POA管理器

    POA管理器(POA Manager)是一个对象,它将一个或多个POA组织在一起,为其中的POA提供共同的操作,POA管理器的状态代表了它所管理的所有POA的状态。

  • 活动对象映射表

    每一个POA中都有一个活动对象映射表(Active Object Map),表中保存了活动对象的对象标识及与之关联的伺服对象,其作用是将活动对象通过对象标识映射到伺服对象。在一个特定的POA中,对象标识唯一地标识了一个CORBA对象。

  • 伺服对象管理器

    伺服对象管理器(servant manager)是程序员自己提供的代码,用于取代POA活动对象映射表的功能。

什么是POA策略?

POA策略是一个对象,负责控制相关POA的行为及这些POA所管理的对象,使用POA前应仔细考虑应用程序所需的策略集。

POA策略可为不同的应用程序设计目标而配置不同的POA。

目前CORBA规范定义了7种标准的POA策略,不同的ORB产品从可伸缩性或可靠性等因素考虑引入一些新的POA策略。
选用POA策略时应注意某些策略值之间存在依赖关系(选用了一种,隐含的选用另一种)。

  • 线程策略

    该策略指定POA使用的线程模型,它有两种取值:
    ORB_CTRL_MODEL(缺省值):表示由ORB负责将对POA的请求指派到线程。在多线程环境中,并发请求可以用多线程传送。
    SINGLE_THREAD_MODEL:这时只有一个线程,POA顺序地处理请求。

  • 生命期策略

    该策略指定POA中对象实现的使用期限,它可有以下值:
    TRANSIENT(缺省值):由POA创建的对象引用是瞬时的,这些对象在创建它的POA之外不可存在。一旦POA被冻结为非活动状态,调用该POA创建的任何对象引用将引发OBJECT_NOT_EXIST异常。对话型对象通常设计为瞬时对象。
    PERSISTENT:由POA创建的持久对象可在创建它的POA之外存在,因而使用这一策略通常还会同时采用USER_ID策略。对持久对象的请求可能导致隐式地激活一个进程、一个POA以及实现该对象的伺服对象,这意味着POA应注册伺服对象定位器或激活器。实体型对象通常设计为持久对象。

  • 对象标识唯一性策略

    该策略允许多个抽象对象共享一个伺服对象,它可取下列值:
    UNIQUE_ID(缺省值):被激活的伺服对象仅支持一个对象标识,POA不允许一个伺服对象与多个CORBA对象相关联。
    MULTIPLE_ID:被激活的伺服对象可以有一个或多个对象标识,在运行时刻调用伺服对象的操作时必须由操作内部决定对象标识。

  • 对象标识指派策略

    该策略指定对象标识是由程序员编写的服务程序生成还是由POA自动生成,它可取以下值:
    USER_ID:由应用程序为POA的对象引用指定对象标识。
    SYSTEM_ID(缺省值):由POA为它的对象引用分配对象标识。如果同时还采用了PERSISTENT策略,则在同一POA的所有实例中对象标识必须是唯一的。

  • 伺服对象保持策略

    该策略指定POA是否将活动伺服对象保存在活动对象映射表中,它有两种取值:
    RETAIN(缺省值):POA利用活动对象映射表跟踪对象的激活情况,通常与伺服对象激活器或POA显式激活方式结合使用。
    NON_RETAIN:POA不在活动对象映射表中保存活动的伺服对象,通常结合伺服对象定位器一起使用。

  • 请求处理策略

    该策略指定POA如何处理请求,它有三种取值:
    USE_ACTIVE_OBJECT_MAP_ONLY(缺省值):POA仅依赖于活动对象映射表决定哪些对象标识可用及对象标识关联到哪些伺服对象。如果在活动对象映射表中找不到对象标识,则引发OBJECT_NOT_EXIST异常。该值必须结合RETAIN策略使用。
    USE_DEFAULT_SERVANT:如果POA在活动对象映射表中找不到对象标识,或已设置NON_RETAIN策略,则将请求分派给一个缺省伺服对象。缺省伺服对象必须先注册,如果未注册则引发OBJ_ADAPTER异常。该值必须结合MULTIPLE_ID策略使用。
    USE_SERVANT_MANAGER:如果POA在活动对象映射表中找不到对象标识,或已设置了NON_RETAIN策略,则POA使用一个伺服对象管理器激活或定位伺服对象。

  • 隐式激活策略

    该策略指定POA是否支持伺服对象的隐式激活,它可取以下值:
    IMPLICIT_ACTIVATION:POA支持隐式激活,服务程序可调用servant_to_reference操作或servant_to_id操作将伺服对象添加到活动对象映射表并转换为对象引用,也可调用伺服对象的_this方法激活伺服对象。该值要求同时使用SYSTEM_ID和RETAIN策略。
    NO_IMPLICIT_ACTIVATION(缺省值):POA不支持伺服对象的隐式激活,只有通过显式的调用才可将伺服对象与一个对象标识相关联。

为什么要有伺服对象管理器,直接通过活动对象映射表就可以了?

伺服对象管理器

  • 是程序员自己编写的代码,主要作用是查找并返回一个伺服对象
  • 并不是所有CORBA应用程序都需要使用伺服对象管理器
  • 有两类伺服对象管理器:伺服对象激活器和伺服对象定位器。
  • 要使用伺服对象管理器,必须为POA设置USE_SERVANT_MANAGER策略,并结合伺服对象保持策略决定使用哪一种类型的伺服对象管理器。
  • 采用RETAIN表示使用伺服对象激活器,常用于激活持久对象;采用NON_RETAIN表示使用伺服对象定位器,常用于查找瞬时对象。