第四章中间件 对CORBA的进一步解释_第1页
第四章中间件 对CORBA的进一步解释_第2页
第四章中间件 对CORBA的进一步解释_第3页
第四章中间件 对CORBA的进一步解释_第4页
第四章中间件 对CORBA的进一步解释_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、山东大学计算机科学与技术学院第四章第四章 对对CORBA的进一步解释的进一步解释山东大学计算机科学与技术学院IDL的特点的特点面向对象面向对象用于定义分布式服务的规格说明用于定义分布式服务的规格说明定义复杂的数据类型定义复杂的数据类型独立于具体的程序设计语言和特定的硬件,网络和独立于具体的程序设计语言和特定的硬件,网络和操作系统平台操作系统平台山东大学计算机科学与技术学院4.2 语法与定义语法与定义词法规则词法规则模块声明模块声明类型的声明类型的声明常量常量异常异常接口接口值类型值类型山东大学计算机科学与技术学院4.2.1 词法规则词法规则类似类似ANSI C+词法规则和预处理特性词法规则和预

2、处理特性关键字是大小写敏感;标识符大小写无关关键字是大小写敏感;标识符大小写无关山东大学计算机科学与技术学院4.2.2 模块的声明模块的声明用于限制标识符的作用域用于限制标识符的作用域一般将逻辑上密切相关的接口,类型,常量,异常一般将逻辑上密切相关的接口,类型,常量,异常等存放在同一模块中等存放在同一模块中山东大学计算机科学与技术学院4.2.3 类型的声明类型的声明基本数据类型基本数据类型复合数据类型复合数据类型 枚举枚举 结构结构 UNION 序列和数组序列和数组山东大学计算机科学与技术学院4.2.4 常量的声明常量的声明转换为该转换为该IDL接口生成的操作接口中的常量声明接口生成的操作接口

3、中的常量声明接口内接口内接口外接口外山东大学计算机科学与技术学院4.2.5 异常的声明异常的声明引入关键字引入关键字exception专门定义异常专门定义异常山东大学计算机科学与技术学院4.2.6 接口的声明接口的声明属性声明属性声明参数传递参数传递单向传递单向传递上下文传递上下文传递继承机制继承机制抽象接口抽象接口山东大学计算机科学与技术学院接口接口属性属性属性不应看作对象的状态数据,是一种特殊的操作属性不应看作对象的状态数据,是一种特殊的操作(0元操作元操作)可读写属性被映射为可读写属性被映射为java中重载的方法中重载的方法(getter(),setter()IDL接口中的属性被映射为接

4、口中的属性被映射为JAVA语言的方法而不是语言的方法而不是变量,因此变量,因此IDL接口可直接映射到接口可直接映射到JAVA的接口而不的接口而不是类是类山东大学计算机科学与技术学院接口接口参数传递方向参数传递方向in:客户到对象实现客户到对象实现out:对象实现到客户对象实现到客户inout:双向双向in可直接映射到可直接映射到java方法的参数方法的参数out,inout无法直接映射,利用持有类解决无法直接映射,利用持有类解决山东大学计算机科学与技术学院接口接口单向操作单向操作没有返回值的操作可设计为没有返回值的操作可设计为oneway操作操作对象实现不确认请求是否真的收到对象实现不确认请求

5、是否真的收到山东大学计算机科学与技术学院接口接口上下文表达式上下文表达式附带于操作中附带于操作中指明客户端那些影响对象请求执行结果的,与发出指明客户端那些影响对象请求执行结果的,与发出调用请求的客户环境有关的因素调用请求的客户环境有关的因素山东大学计算机科学与技术学院4.2.7 值类型的声明值类型的声明作用作用典型用法典型用法声明形式声明形式 抽象抽象 具体具体 动态确定参数传递动态确定参数传递 盒装值类型盒装值类型 定制值类型与可截断值类型定制值类型与可截断值类型山东大学计算机科学与技术学院值类型值类型作用作用在网络中传递对象状态信息,即为了实现按值传递在网络中传递对象状态信息,即为了实现按

6、值传递对象对象山东大学计算机科学与技术学院值类型值类型典型用法典型用法按值调用传递参数:创建实参的副本按值调用传递参数:创建实参的副本远程操作返回一个对象时创建返回的副本远程操作返回一个对象时创建返回的副本实质:一个对象的目的是为了封装数据,或一个实质:一个对象的目的是为了封装数据,或一个APP需要显式地对某一对象进行复制,该对象应使需要显式地对某一对象进行复制,该对象应使用用IDL值类型而不是接口类型,此时的对象实例称值类型而不是接口类型,此时的对象实例称为为“值值”山东大学计算机科学与技术学院值类型值类型抽象值类型抽象值类型只含操作的基调而没有状态数据和初始化数据,因只含操作的基调而没有状

7、态数据和初始化数据,因而不能创建值的实例而不能创建值的实例可继承多个抽象值类型,但不能继承具体值类型可继承多个抽象值类型,但不能继承具体值类型山东大学计算机科学与技术学院值类型值类型具体值类型具体值类型类似类似IDL结构类型,但允许包含状态数据和初始化结构类型,但允许包含状态数据和初始化数据数据可继承单个具体值和多个抽象值类型,还可支持单可继承单个具体值和多个抽象值类型,还可支持单个具体接口和多个抽象接口个具体接口和多个抽象接口映射为映射为JAVA的抽象类的抽象类对接口的支持关系映射为对接口的支持关系映射为JAVA中类对接口的实现关中类对接口的实现关系系山东大学计算机科学与技术学院值类型值类型

8、盒装值类型盒装值类型允许将非值类型的允许将非值类型的IDL数据类型包装为值类型数据类型包装为值类型山东大学计算机科学与技术学院值类型值类型定制值类型与可截断值类型定制值类型与可截断值类型不采用默认的对象打包和解包操作,而是由程序员不采用默认的对象打包和解包操作,而是由程序员手工实现由手工实现由CustomMarshal接口继承的接口继承的marshal()和和unmarshal()方法方法映射的映射的java抽象类继承抽象类继承CustomValue,而不像具体值,而不像具体值类型那样继承类型那样继承StreamableValue不生成映射的不生成映射的read(),write()方法,需自己

9、实现方法,需自己实现山东大学计算机科学与技术学院4.4.1 接口库的定义接口库的定义接口定义也可由一个专门的服务进程来存储或管理,接口定义也可由一个专门的服务进程来存储或管理,即把即把IDL文件中地对象接口定义组织成可运行的接文件中地对象接口定义组织成可运行的接口库服务,由该服提供对象接口的相关信息口库服务,由该服提供对象接口的相关信息表达的信息与表达的信息与IDL文件完全相同,更适于动态访问文件完全相同,更适于动态访问常见用法:查找一个对象引用的所有常见用法:查找一个对象引用的所有IDL接口定义接口定义客户程序或对象实现利用接口库获取一个编译时未客户程序或对象实现利用接口库获取一个编译时未知

10、类型的对象引用的详细接口信息,从而更好地利知类型的对象引用的详细接口信息,从而更好地利用用DII,DSI山东大学计算机科学与技术学院4.4.2 结构结构接口库将接口描述看作对象,为其定义了新的接口,接口库将接口描述看作对象,为其定义了新的接口,无需引入数据库机制无需引入数据库机制层次结构层次结构库标识:用于唯一标识一个接口库对象的字符串库标识:用于唯一标识一个接口库对象的字符串 IDL:一系列一系列/分隔的标识符分隔的标识符:版本号版本号 IDL:Bank/Account/deposit:1.0山东大学计算机科学与技术学院对象适配器对象适配器作用:管理服务器端伺服对象,对象标识,作用:管理服务

11、器端伺服对象,对象标识,CORBA对象以及它们之间关联的主要工具是对象适配器对象以及它们之间关联的主要工具是对象适配器决定在收到一个客户请求时应调用哪一个伺服对象,决定在收到一个客户请求时应调用哪一个伺服对象,然后调用该伺服对象上的合适操作然后调用该伺服对象上的合适操作POA的可移植性指建立在的可移植性指建立在POA基础上的服务端程序基础上的服务端程序不依赖于特定的不依赖于特定的ORB产品,从而在不同产品,从而在不同ORB产品之产品之间是可移植的间是可移植的山东大学计算机科学与技术学院可移植对象适配器可移植对象适配器POA是对象实现与是对象实现与ORB其他组件之间的中介,它将客户请求传送到其他

12、组件之间的中介,它将客户请求传送到伺服伺服对象,对象,按需创建按需创建子子POA,提供管理,提供管理伺服对象的伺服对象的策略策略。对对CORBACORBA对象发出的所有调用请求都必须经过对象发出的所有调用请求都必须经过POAPOA,即使目标对象是本地,即使目标对象是本地的(即伺服对象与客户程序处于同一地址空间),这样的(即伺服对象与客户程序处于同一地址空间),这样POAPOA能够统一地能够统一地应用应用POAPOA策略策略ORB内核内核对象适配器对象适配器对象实现对象实现山东大学计算机科学与技术学院CORBA对象与伺服对象对象与伺服对象 CORBA对象对象与具体的与具体的伺服对象伺服对象是两个

13、不同抽象层次的概念:是两个不同抽象层次的概念: 它们之间的彻底分离使得它们之间的彻底分离使得CORBA独立于任何特定程序设计语言,并为服务独立于任何特定程序设计语言,并为服务端程序的可移植性打下基础。对象适配器(端程序的可移植性打下基础。对象适配器(object adapter)是一个重要的)是一个重要的ORB组件,它负责将抽象的组件,它负责将抽象的CORBA对象映射到具体的伺服对象。对象映射到具体的伺服对象。CORBA对象可看作是一个具有对象标识、对象接口及对象实现的抽象实对象可看作是一个具有对象标识、对象接口及对象实现的抽象实体。体。 之所以称为抽象的,是因为并没有硬性规定之所以称为抽象的

14、,是因为并没有硬性规定CORBA对象的实现机制。由于对象的实现机制。由于独立于程序设计语言和特定独立于程序设计语言和特定ORB产品,一个产品,一个CORBA对象的引用又称可互操对象的引用又称可互操作的对象引用(作的对象引用(Interoperable Object Reference)。从客户程序的角度看,)。从客户程序的角度看,IOR中包含了对象的标识、接口类型及其他信息以查找对象实现。中包含了对象的标识、接口类型及其他信息以查找对象实现。山东大学计算机科学与技术学院CORBA对象与伺服对象对象与伺服对象 伺服对象(伺服对象(servant)是指具体程序设计语言的对象或实体,通常存在于)是指

15、具体程序设计语言的对象或实体,通常存在于一个服务程序进程之中。一个服务程序进程之中。 客户程序通过对象引用发出的请求经过客户程序通过对象引用发出的请求经过ORB担当中介角色,转换为对特定的担当中介角色,转换为对特定的伺服对象的调用。伺服对象的调用。在一个在一个CORBA对象的生命期中,它可能与多个伺服对象对象的生命期中,它可能与多个伺服对象相关联,因而对该对象的请求可能被发送到不同的伺服对象。相关联,因而对该对象的请求可能被发送到不同的伺服对象。对象标识(对象标识(Object ID)是一个用于在)是一个用于在POA中标识一个中标识一个CORBA对象的字对象的字符串。符串。 它既可由程序员指派

16、,也可由对象适配器自动分配,这两种方式都要求对象它既可由程序员指派,也可由对象适配器自动分配,这两种方式都要求对象标识在创建它的对象适配器中必须具有唯一性。标识在创建它的对象适配器中必须具有唯一性。山东大学计算机科学与技术学院CORBA对象与伺服对象对象与伺服对象 伺服对象通过对象标识关联到伺服对象通过对象标识关联到CORBA对象。对象。 建立一个伺服对象与一个建立一个伺服对象与一个CORBA对象之间关联的过程称为对象之间关联的过程称为“激活激活”(activate)或)或“体现体现”(incarnate),反之,撤销这种关联的过程),反之,撤销这种关联的过程称为称为“冻结冻结”(deacti

17、vate)或)或“净化净化”(etherealize)。)。 经过激活或体现后,经过激活或体现后,CORBA对象、伺服对象以及对象标识均可称为对象、伺服对象以及对象标识均可称为活动的(活动的(active),否则称它们为非活动的(),否则称它们为非活动的(inactive)。)。 不是简单的不是简单的new持久对象(持久对象(persistent object)可在创建它的服务程序进程之)可在创建它的服务程序进程之外存在,瞬时对象(外存在,瞬时对象(transient object)只能在创建它的服务)只能在创建它的服务程序进程中存在。它们都是指一个程序进程中存在。它们都是指一个CORBA对象

18、。对象。山东大学计算机科学与技术学院Corba对象对象伺服对象伺服对象 ID山东大学计算机科学与技术学院POA体系结构体系结构POA体系结构服务程序 伺服对象管理器 伺服对象1客户请求 伺服对象2伺服对象3POAPOA根POA注册的伺服对象管理器 活动对象映射表对象标识1 对象标识2 对象标识3 POA管理器山东大学计算机科学与技术学院可移植对象适配器可移植对象适配器客户请求的传递过程 客户程序发出的请求中包含:创建对象引用的POA名字、对象标识及目标机器与端口等信息。 如果目标POA不存在,ORB还允许调用适配器激活器创建所需的POA。服务程序 伺服对象管理器 伺服对象1客户请求 伺服对象2

19、伺服对象3POAPOA根POA注册的伺服对象管理器 活动对象映射表对象标识1 对象标识2 对象标识3 POA管理器山东大学计算机科学与技术学院一旦请求被ORB传送到正确的机器与端口,监听该端口的POA管理器负责检查对象关键码(object key),对象关键码中含有POA名字与对象标识; POA管理器利用对象关键码将请求传送给正确的POA服务程序 伺服对象管理器 伺服对象1客户请求 伺服对象2伺服对象3POAPOA根POA注册的伺服对象管理器 活动对象映射表对象标识1 对象标识2 对象标识3 POA管理器山东大学计算机科学与技术学院 POA利用对象关键码确定对象标识,根据POA的策略集直接或间

20、接地利用对象标识将请求传送到正确的伺服对象。服务程序 伺服对象管理器 伺服对象1客户请求 伺服对象2伺服对象3POAPOA根POA注册的伺服对象管理器 活动对象映射表对象标识1 对象标识2 对象标识3 POA管理器山东大学计算机科学与技术学院客户请求的传递客户请求的传递客户程序客户程序POA管理器管理器POA管理器正在管理器正在监听的端口号监听的端口号ORB对象定位信息对象定位信息请求内容请求内容1. 客户程序向客户程序向ORB发出请求发出请求对象定位信息对象定位信息请求内容请求内容目标机器、端口目标机器、端口对象关键码对象关键码ORB2. ORB根据其中的目标机器和端根据其中的目标机器和端口

21、信息将请求发送到指定端口口信息将请求发送到指定端口目标机器、端口目标机器、端口山东大学计算机科学与技术学院对象关键码对象关键码客户请求的传递客户请求的传递POA名字名字对象标识对象标识name1POA3. POA管理器根据请求中的管理器根据请求中的POA名字将请求发送到特定的名字将请求发送到特定的POA请求内容请求内容name2POAPOA管理器管理管理器管理多个多个POA.POA管理器管理器POA名字名字name2POA活动对象映射表对象标识1 对象标识2 对象标识3 伺服对象1伺服对象2伺服对象3对象标识对象标识请求内容请求内容4. POA根据对象标识将请求传到根据对象标识将请求传到正确的

22、伺服对象正确的伺服对象山东大学计算机科学与技术学院POAPOA接口接口 / POA接口 interface POA / POA属性 readonly attribute string the_name; readonly attribute POA the_parent; readonly attribute POAList the_children; readonly attribute POAManager the_POAManager; attribute AdapterActivator the_activator; / 异常定义 exception AdapterAlreadyExi

23、sts ; exception AdapterNonExistent ; exception InvalidPolicy unsigned short index; ; exception NoServant ; exception ObjectAlreadyActive ; exception ObjectNotActive ; exception ServantAlreadyActive ; exception ServantNotActive ; exception WrongAdapter ; exception WrongPolicy ;POA接口山东大学计算机科学与技术学院POAP

24、OA接口接口 / 创建与撤销POA POA create_POA(in string adapter_name, in POAManager a_POAManager,in CORBA:PolicyList policies) raises(AdapterAlreadyExists, InvalidPolicy); POA find_POA(in string adapter_name, in boolean activate_it) raises(AdapterNonExistent); void destroy(in boolean etherealize_objects, in bool

25、ean wait_for_completion); / 用于创建策略对象的factory操作 ThreadPolicy create_thread_policy(in ThreadPolicyValue value); LifespanPolicy create_lifespan_policy(in LifespanPolicyValue value); /.POA接口山东大学计算机科学与技术学院POAPOA接口接口 / 伺服对象管理器的注册 ServantManager get_servant_manager() raises(WrongPolicy); void set_servant_m

26、anager(in ServantManager imgr) raises(WrongPolicy); / 为USE_DEFAULT_SERVANT策略提供的操作 Servant get_servant() raises(NoServant, WrongPolicy); void set_servant(in Servant p_servant) raises(WrongPolicy); / 对象激活与冻结 ObjectId activate_object(in Servant p_servant) raises(ServantAlreadyActive, WrongPolicy); void

27、 activate_object_with_id(in ObjectId id, in Servant p_servant) raises(ServantAlreadyActive, ObjectAlreadyActive, WrongPolicy); void deactivate_object(in ObjectId oid) raises(ObjectNotActive, WrongPolicy);POA接口山东大学计算机科学与技术学院POAPOA接口接口 / 创建CORBA对象引用的操作 Object create_reference(in CORBA:RepositoryId int

28、f) raises(WrongPolicy); Object create_reference_with_id(in ObjectId oid, in CORBA:RepositoryId intf) raises(WrongPolicy); / 对象标识映射操作 ObjectId servant_to_id(in Servant p_servant) raises(ServantNotActive, WrongPolicy); Object servant_to_reference(in Servant p_servant) raises(ServantNotActive, WrongPol

29、icy); Servant reference_to_servant(in Object reference) raises(ObjectNotActive, WrongAdapter, WrongPolicy); ObjectId reference_to_id(in Object reference) raises(WrongAdapter, WrongPolicy); Servant id_to_servant(in ObjectId oid) raises(ObjectNotActive, WrongPolicy); Object id_to_reference(in ObjectId

30、 oid) raises(ObjectNotActive, WrongPolicy); ;POA接口山东大学计算机科学与技术学院为什么要有多个为什么要有多个POA,如果只有一个的话,也不,如果只有一个的话,也不需要什么管理器了需要什么管理器了山东大学计算机科学与技术学院 POA层次一个服务程序进程中可使用多个POA,不同POA以名字区分。这些POA的集合呈现一种层次结构,即每个POA都有一个父POA,所有POA都是根POA的后代。每个ORB在创建时都自动带有一个根POA,可根据需要从根POA创建其他子POA。POA层次为服务程序中的对象标识提供了一个层次化的名字空间。通常每个伺服对象最多仅与一

31、个POA相关联,POA“拥有(包括POA策略)”这些对象并负责删除这些对象,当POA被删除时其中的所有对象以及子POA也将被删除。服务程序 伺服对象管理器 伺服对象1客户请求 伺服对象2伺服对象3POAPOA根POA注册的伺服对象管理器 活动对象映射表对象标识1 对象标识2 对象标识3 POA管理器山东大学计算机科学与技术学院 POA管理器POA管理器(POA Manager)是一个对象,它将一个或多个POA组织在一起,为其中的POA提供共同的操作,POA管理器的状态代表了它所管理的所有POA的状态。例如开发人员可通过POA管理器提供的操作决定是否接收或丢弃POA的请求,也可利用POA管理器终

32、止POA。服务程序 伺服对象管理器 伺服对象1客户请求 伺服对象2伺服对象3POAPOA根POA注册的伺服对象管理器 活动对象映射表对象标识1 对象标识2 对象标识3 POA管理器山东大学计算机科学与技术学院活动对象映射表活动对象映射表每一个POA中都有一个活动对象映射表(Active Object Map),表中保存了活动对象的对象标识及与之关联的伺服对象,其作用是将活动对象通过对象标识映射到伺服对象。在一个特定的POA中,对象标识唯一地标识了一个CORBA对象。为将伺服对象转换为一个可供远程调用的CORBA对象,必须建立CORBA对象与伺服对象之间的关联。此外,POA还允许单个伺服对象(即

33、缺省伺服对象)同时与多个CORBA对象相关联,这种特性对开发大规模应用意义重大。服务程序 伺服对象管理器 伺服对象1客户请求 伺服对象2伺服对象3POAPOA根POA注册的伺服对象管理器 活动对象映射表对象标识1 对象标识2 对象标识3 POA管理器山东大学计算机科学与技术学院伺服对象管理器伺服对象管理器伺服对象管理器(servant manager)是程序员自己提供的代码,用于取代POA活动对象映射表的功能。如果应用程序需要以一种更复杂的方案将对象标识映射到伺服对象,这时开发人员可设计专用的伺服对象管理器。伺服对象管理器负责决定一个CORBA对象是否存在,然后查找伺服对象并将伺服对象指派给C

34、ORBA对象。为满足不同的应用需要,开发人员可设计多个伺服对象管理器。有两类伺服对象管理器可供选择:伺服对象激活器和伺服对象定位器,开发人员可利用POA策略决定选用哪一种类型。 服务程序 伺服对象管理器 伺服对象1客户请求 伺服对象2伺服对象3POAPOA根POA注册的伺服对象管理器 活动对象映射表对象标识1 对象标识2 对象标识3 POA管理器山东大学计算机科学与技术学院什么是什么是POA策略策略? POA策略是一个对象,负责控制策略是一个对象,负责控制相关相关POA的行为的行为及及这些这些POA所管理的对象所管理的对象,使用,使用POA前应仔细考虑应前应仔细考虑应用程序所需的策略集。用程序

35、所需的策略集。POA策略可为不同的应用程序设计目标而配置不同策略可为不同的应用程序设计目标而配置不同的的POA。目前目前CORBA规范定义了规范定义了7种标准的种标准的POA策略,不同策略,不同的的ORB产品从产品从可伸缩性可伸缩性或或可靠性可靠性等因素考虑引入一等因素考虑引入一些新的些新的POA策略。策略。山东大学计算机科学与技术学院选用选用POA策略策略 选用选用POA策略时应注意某些策略值之间存在依赖关系(选用策略时应注意某些策略值之间存在依赖关系(选用了一种,隐含的选用另一种)。了一种,隐含的选用另一种)。 线程策略线程策略该策略指定POA使用的线程模型,它有两种取值:ORB_CTRL

36、_MODEL(缺省值):表示由ORB负责将对POA的请求指派到线程。在多线程环境中,并发请求可以用多线程传送。SINGLE_THREAD_MODEL:这时只有一个线程,POA顺序地处理请求。山东大学计算机科学与技术学院选用选用POA策略策略生命期策略生命期策略该策略指定POA中对象实现的使用期限,它可有以下值:TRANSIENT(缺省值):由POA创建的对象引用是瞬时的,这些对象在创建它的POA之外不可存在。一旦POA被冻结为非活动状态,调用该POA创建的任何对象引用将引发OBJECT_NOT_EXIST异常。对话型对象通常设计为瞬时对象。PERSISTENT:由POA创建的持久对象可在创建它

37、的POA之外存在,因而使用这一策略通常还会同时采用USER_ID策略。对持久对象的请求可能导致隐式地激活一个进程、一个POA以及实现该对象的伺服对象,这意味着POA应注册伺服对象定位器或激活器。实体型对象通常设计为持久对象。山东大学计算机科学与技术学院选用选用POA策略策略对象标识唯一性策略对象标识唯一性策略该策略允许多个抽象对象共享一个伺服对象,它可取下列值:UNIQUE_ID(缺省值):被激活的伺服对象仅支持一个对象标识,POA不允许一个伺服对象与多个CORBA对象相关联。MULTIPLE_ID:被激活的伺服对象可以有一个或多个对象标识,在运行时刻调用伺服对象的操作时必须由操作内部决定对象

38、标识。应指出的是,对象标识在特定的POA中总是唯一的,对象标识唯一性策略指的是对象标识与伺服对象之间关联的唯一性或多重性。 山东大学计算机科学与技术学院选用选用POA策略策略对象标识指派策略对象标识指派策略该策略指定对象标识是由程序员编写的服务程序生成还是由POA自动生成,它可取以下值:USER_ID:由应用程序为POA的对象引用指定对象标识。SYSTEM_ID(缺省值):由POA为它的对象引用分配对象标识。如果同时还采用了PERSISTENT策略,则在同一POA的所有实例中对象标识必须是唯一的。典型情况将是USER_ID策略用于持久对象,将SYSTEM_ID策略用于瞬时对象。如果想将SYST

39、EM_ID策略用于持久对象,可从伺服对象或对象引用中提取对象标识。 山东大学计算机科学与技术学院选用选用POA策略策略伺服对象保持策略伺服对象保持策略该策略指定POA是否将活动伺服对象保存在活动对象映射表中,它有两种取值:RETAIN(缺省值):POA利用活动对象映射表跟踪对象的激活情况,通常与伺服对象激活器或POA显式激活方式结合使用。NON_RETAIN:POA不在活动对象映射表中保存活动的伺服对象,通常结合伺服对象定位器一起使用。该策略决定POA是否利用活动对象映射表跟踪对象标识与伺服对象之间的关联。如果选择NON_RETAIN策略则意味着不使用活动对象映射表,因而使用该策略的应用程序必

40、须提供一个伺服对象定位器类型的伺服对象管理器。 山东大学计算机科学与技术学院选用选用POA策略策略请求处理策略请求处理策略 该策略指定POA如何处理请求,它有三种取值:USE_ACTIVE_OBJECT_MAP_ONLY(缺省值):POA仅依赖于活动对象映射表决定哪些对象标识可用及对象标识关联到哪些伺服对象。如果在活动对象映射表中找不到对象标识,则引发OBJECT_NOT_EXIST异常。该值必须结合RETAIN策略使用。USE_DEFAULT_SERVANT:如果POA在活动对象映射表中找不到对象标识,或已设置NON_RETAIN策略,则将请求分派给一个缺省伺服对象。缺省伺服对象必须先注册,

41、如果未注册则引发OBJ_ADAPTER异常。该值必须结合MULTIPLE_ID策略使用。USE_SERVANT_MANAGER:如果POA在活动对象映射表中找不到对象标识,或已设置了NON_RETAIN策略,则POA使用一个伺服对象管理器激活或定位伺服对象。山东大学计算机科学与技术学院选用选用POA策略策略隐式激活策略隐式激活策略该策略指定POA是否支持伺服对象的隐式激活,它可取以下值:IMPLICIT_ACTIVATION:POA支持隐式激活,服务程序可调用servant_to_reference操作或servant_to_id操作将伺服对象添加到活动对象映射表并转换为对象引用,也可调用伺服

42、对象的_this方法激活伺服对象。该值要求同时使用SYSTEM_ID和RETAIN策略。NO_IMPLICIT_ACTIVATION(缺省值):POA不支持伺服对象的隐式激活,只有通过显式的调用才可将伺服对象与一个对象标识相关联。山东大学计算机科学与技术学院POAPOA管理器与适配器激活器接口管理器与适配器激活器接口POA管理器与适配器激活器接口 / POA管理器接口 interface POAManager exception AdapterInactive; enum State HOLDING, ACTIVE, DISCARDING, INACTIVE ; void activate()

43、 raises(AdapterInactive); void hold_requests(in boolean wait_for_completion) raises(AdapterInactive); void discard_requests(in boolean wait_for_completion) raises(AdapterInactive); void deactivate(in boolean etherealize_objects, in boolean wait_for_completion) raises(AdapterInactive); State get_stat

44、e(); ; / 适配器激活器接口 interface AdapterActivator boolean unknown_adapter(in POA parent, in string name); ;山东大学计算机科学与技术学院使用使用POA调用调用ORB伪对象的伪对象的resolve_initial_references()操作获取根操作获取根POA的对象引用的对象引用利用根利用根POA提供的操作定义应用程序所需的提供的操作定义应用程序所需的POA策略集策略集用自定义用自定义POA策略集在根策略集在根POA下创建一个子下创建一个子POA甚至一个完甚至一个完整的整的POA层次层次激活激活P

45、OA管理器,通常整个服务程序只需使用一个管理器,通常整个服务程序只需使用一个POA管理管理器器创建或激活对象引用创建或激活对象引用山东大学计算机科学与技术学院使用使用POApublic class Server public static void main(String args) try org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); POA rootPOA = POAHelper.narrow( orb.resolve_initial_references(RootPOA); org.omg.CORBA.Policy

46、 policies = rootPOA.create_lifespan_policy(LifespanPolicyValue.PERSISTENT) ; POA myPOA = rootPOA.create_POA(BankPOA, rootPOA.the_POAManager(), policies); AccountManagerImpl managerServant = new AccountManagerImpl(); myPOA.activate_object_with_id( BankManager.getBytes(), managerServant); rootPOA.the_

47、POAManager().activate(); System.out.println(帐户管理员BankManager已就绪 .n); orb.run(); catch(Exception exc) exc.printStackTrace(); 服务程序Server.java调用调用ORB伪对象的伪对象的resolve_initial_references操作获取根操作获取根POA的引用的引用调用根调用根POA的操作的操作定义应用程序所需的定义应用程序所需的POA策略策略用自定义策略在根用自定义策略在根POA下创建一个子下创建一个子POAmyPOA, 甚至创建一个完整的甚至创建一个完整的PO

48、A层次;层次;创建并激活伺服对象创建并激活伺服对象激活激活POA管理器管理器,等待处理客户程序的请求等待处理客户程序的请求初始化初始化ORB并取根并取根POA的引用的引用山东大学计算机科学与技术学院初始化初始化ORB作用:获取作用:获取ORB伪对象的引用,以备调用伪对象的引用,以备调用ORB内核内核提供的操作时使用提供的操作时使用伪对象伪对象(pseudo object):在:在CORBA基础设施中一个基础设施中一个对象对象, 开发人员可以用一种统一的观点看待所有对象开发人员可以用一种统一的观点看待所有对象CORBA规范中,伪对象也采用规范中,伪对象也采用IDL定义,称为伪定义,称为伪IDL(

49、PIDL)山东大学计算机科学与技术学院获取根获取根POA的对象引用的对象引用所有所有CORBA服务程序必须获取根服务程序必须获取根POA的对象引用的对象引用根根POA即可直接管理对象,也可创建不同策略集的子即可直接管理对象,也可创建不同策略集的子POA有一个预定义的策略集,由于仅当创建有一个预定义的策略集,由于仅当创建POA时才可设置时才可设置POA的策略集,的策略集,而不可更改已有的策略集,因此根而不可更改已有的策略集,因此根POA的策略集不可更改的策略集不可更改/解析”RootPOA”为一个通用对象Org.omg.CORBA.Object obj = orb.resolve_initial

50、_references(“RootPOA”);/将通用对象类型窄化为POA类型POA rootPOA = POAHelper.narrow(obj);山东大学计算机科学与技术学院创建自定义策略的创建自定义策略的POA创建一个新的子创建一个新的子POA的主要目的是为了获取不同的的主要目的是为了获取不同的POA行为,例如使用行为,例如使用持久对象或使用伺服对象管理器等持久对象或使用伺服对象管理器等注:注:POA层次结构并不意味着层次结构并不意味着POA策略也具有相应的层次结构,子策略也具有相应的层次结构,子POA并不继承其父并不继承其父POA的任何策略的任何策略利用利用create_POA()方法

51、可以创建一个新的方法可以创建一个新的POA作为该作为该POA的子的子POA, 可以可以根据实际需要以这种方式创建多个子根据实际需要以这种方式创建多个子POA,从而形成一个,从而形成一个POA层次层次org.omg.CORBA.Policy policies = rootPOA.create_lifespan_policy(LifesPERSISTENT);POA myPOA = rootPOA.create_POA(“ABC”,rootPOA.the_POAManager(),policies);山东大学计算机科学与技术学院服务程序创建子服务程序创建子POA只需提供子只需提供子POA的名字,客

52、户的名字,客户程序必须使用完整的程序必须使用完整的POA名字指定一个子名字指定一个子POA一个完整的一个完整的POA名字记录了该子名字记录了该子POA名字在内的整名字在内的整个层次路径,层次之间用个层次路径,层次之间用”/”分割,如分割,如“/A/B/C”,”/”表示根表示根POA山东大学计算机科学与技术学院使用使用POA管理器管理器 持有状态持有状态create_POA 非活动状态非活动状态丢弃状态丢弃状态活动状态活动状态activate hold_requests deactivate destroy deactivateactivatediscard_requestshold_reque

53、sts discard_requestsdeactivatePOA管理器的状态以及引起状态转换的操作如下面状态转换图所示。管理器的状态以及引起状态转换的操作如下面状态转换图所示。山东大学计算机科学与技术学院使用使用POA管理器管理器活动状态活动状态当POA管理器处于活动状态时,由它控制的所有POA将接收并开始处理请求。调用POA管理器的activate操作可将POA管理器从持有或丢弃状态改为活动状态。void activate()raises(AdapterInactive);注意即使在活动状态下,由于ORB实现或系统资源限制等原因,POA也可能需要将来不及处理的请求排队。每一个ORB产品都会

54、限制请求队列的最大长度,超过该限制时POA会返回一个TRANSIENT异常给客户程序。 持有状态create_POA 非活动状态丢弃状态活动状态活动状态activate hold_requests deactivate destroy deactivateactivatediscard_requestshold_requests discard_requestsdeactivate山东大学计算机科学与技术学院使用使用POA管理器管理器持有状态持有状态POA管理器被创建后即处于持有状态,在该状态下所有接入的请求被引导到一个队列中等候处理,POA并没有对请求作任何处理。为分派这些请求,必须将POA

55、管理器转换为活动状态,即利用POA管理器的activate操作激活该POA管理器。例如代码rootPOA.the_POAManager().activate(); 将根POA的POA管理器激活为活动状态。持有状态持有状态create_POA 非活动状态丢弃状态活动状态activate hold_requests deactivate destroy deactivateactivatediscard_requestshold_requests discard_requestsdeactivate山东大学计算机科学与技术学院使用使用POA管理器管理器丢弃状态丢弃状态 当POA管理器处于丢弃状态时

56、,由它控制的所有POA丢弃任何未开始处理的请求,此外不会调用注册到这些POA的任何适配器激活器。引入丢弃状态为服务程序提供了一种流量控制手段,例如为避免服务程序被突如其来的大量请求淹没,可利用该状态拒绝接入请求,这时ORB会返回TRANSIENT异常通知客户程序它们的请求已被丢弃,由客户程序决定是否重新发送请求。持有状态create_POA 非活动状态丢弃状态丢弃状态活动状态activate hold_requests deactivate destroy deactivateactivatediscard_requestshold_requests discard_requestsdeact

57、ivate山东大学计算机科学与技术学院使用使用POA管理器管理器非活动状态非活动状态当POA管理器处于此状态时,由它控制的所有POA拒绝接入请求。与丢弃状态不同,仅当POA管理器要关闭时才使用该状态,因为处于该状态的POA管理器不能再转换到任何其他状态,否则会引发AdapterInactive异常。持有状态create_POA 非活动状态非活动状态丢弃状态活动状态activate hold_requests deactivate destroy deactivateactivatediscard_requestshold_requests discard_requestsdeactivate山

58、东大学计算机科学与技术学院激活与冻结对象激活与冻结对象对象引用:是客户程序操纵对象引用:是客户程序操纵CORBA对象的句柄,服对象的句柄,服务端程序必须向客户端程序输出对象引用才可为客户务端程序必须向客户端程序输出对象引用才可为客户程序提供进一步的信息或服务程序提供进一步的信息或服务激活:对象引用通过对象标识与伺服对象建立关联激活:对象引用通过对象标识与伺服对象建立关联如果如果POA采用采用RETAIN策略,可有三种激活方式:显策略,可有三种激活方式:显示激活,隐式激活,按需激活;若采用示激活,隐式激活,按需激活;若采用NON_RETAIN策略,对象只能按需激活策略,对象只能按需激活山东大学计

59、算机科学与技术学院显式激活显式激活调用调用POA的的activate_object_with_id()或或activate_obj()显式地建立伺服对象与一个对象标识的关联显式地建立伺服对象与一个对象标识的关联activate_object_with_id():将对象标识和一个伺服:将对象标识和一个伺服对象的关联登记在活动对象映射表中对象的关联登记在活动对象映射表中activate_obj():提供一个伺服对象,由系统自动指:提供一个伺服对象,由系统自动指派一个对象标识,然后将两者关联登记在活动对象派一个对象标识,然后将两者关联登记在活动对象映射表中,最后返回系统分配的对象标识符映射表中,最后

60、返回系统分配的对象标识符山东大学计算机科学与技术学院隐式激活隐式激活调用调用POA的的servant_to_reference(), servant_to_id()操操作或调用伺服对象的作或调用伺服对象的_this()操作隐式地激活对象操作隐式地激活对象同时采用的策略:同时采用的策略:IMPLICIT_ACTIVATION, SYSTEM_ID,RETAIN山东大学计算机科学与技术学院为什么要有伺服对象管理器,直接通过活动对象为什么要有伺服对象管理器,直接通过活动对象映射表就可以了映射表就可以了山东大学计算机科学与技术学院伺服对象管理器伺服对象管理器 是程序员自己编写的代码,主要作用是查找并返

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论