可移植对象适配器.ppt
《可移植对象适配器.ppt》由会员分享,可在线阅读,更多相关《可移植对象适配器.ppt(49页珍藏版)》请在三一办公上搜索。
1、可移植对象适配器,11.2 简介 POA技术提供地最基本地服务是:对象创建、伺服程序注册以及请求地调调度。POA提供了一整套特性和服务,可以利用它来编写可扩缩的、高性能的服务器应用程序,它在合理控制资源请求方面起着重要的作用。11.3 POA基本原理 在一个服务器应用程序中,POA负责创建对象、激活对象以及将对各个对象的请求调度到它们各自的伺服程序上,通过POA,CORBA对象完成了编程语言所提供的伺服程序的相互对应关系。当一个对象处于激活状态时,该对象就可以接收并执行请求。当对象得到一个请求后,该对象必须由伺服程序进行具体化,或给它以具体形式。一个给定对象仅由一个单个的伺服程序在给定点及时进
2、行具体化,但超时以后,可以创建许多伺服程序实例来具体化一个CORBA对象。最后每一个伺服程序释放后就结束了它与相对应的CORBA对象之间的连接。具体化和释放是应用于伺服程序的,创建和撤消是应用于CORBA对象的。,11.3.1 基本的请求调度,基本调度如下:(1)首先,服务器应用程序以某种方式为CORBA对象到处一个对象引用。客户机可能通过命名服务或者交易服务或者从另一个请求接收它来获得到处对象引用。对象引用从逻辑上“指向”目标CORBA对象,像C+指针指向它底层的C+对象一样。(2)其次,在应用程序的控制下,客户程序ORB使用对象引用来决定对象驻留在何处和如何访问它,然后它向服务器ORB发送
3、请求。(3)再次,服务器ORB接收请求并将其调度给拥有该目标对象的POA。(4)最后,POA通过调用具体化该目标对象的伺服程序来继续执行该调度。,11.3.2 关键的POA实体,有三种关键实体涉及到POA 对象引用 POA负责创建对象引用。对象标识符 在POA主机的作用域内,每一个对象通过调用一个octet序列的对象标识符进行识别。当POA创建一个新的CORBA对象时,典型情况是,它就将对象标识符嵌入在对象引用的对象密钥部分。伺服程序 引用程序直接通过POA可以创建并注册伺服程序来具体化对象。同样,应用程序可以向POA提供伺服程序管理器对象,当需要执行一个请求时,POA就能创建伺服程序。应用程
4、序甚至可以提供一个默认的伺服程序。与POA策略有关,在任何给定的时间,单个的伺服程序可以用POA注册来具体化一个和多个的CORBA对象。POA通过目标对象的对象标识符与合适的伺服程序之间的映射来调度请求。一个伺服程序也可以通过对一个伺服程序的_this调用隐式创建一个新的CORBA对象,并为其注册一个伺服程序。,11.4 POA策略,POA规范的关键特性就是一个应用程序可以包含多个POA实例。每一个POA实例代表具有相似性能的一组对象。这些性能通过POA创建时所指定的POA策略来控制。所有应用程序至少有一个POA,也就是Root POA,它具有标准的策略集。策略是用来定义POA性能的对象,该对
5、象在策略内部创建。向POA和POAManager接口一样,CORBA规范指出,在标准的PortableServer模块中定义POA策略接口。像所有的策略接口一样,POA策略类从CORBA:Policy接口派生出来。Policy接口及相关的类型提供的管理操作(1)通过基本的Policy接口,利用policy_type只读属性可以确定策略的实际派生类型。PolicyType是由OMG控制的一个标志值,这样可以确保所有的标准接口都有一个唯一的标志(2)copy操作可以克隆(clone)一个Policy对象。返回的引用指向目标Policy对象的一个全新的拷贝。,POA策略,(3)destory操作用来
6、撤消目标Policy对象。(4)PoicyList用来将指向各种派生Policy对象的引用分组来形成策略集。POA创建操作接收一个PolicyList类型的参数,这个参数可以将策略设置成新的POA。策略对象是局部约束对象。也就是任何试图将它们的引用作为参数传递给标准的CORBA操作或通过ORB:object_to_string将它们转换成字符串的操作都将产生CORBA:MARCHAL异常。,11.4.1 CORBA对象生存期范围,假如一个客户程序向一个当前没有运行或没有激活的目标对象发出一个请求,如果必要的话,ORB工具就会为该对象激活一个服务器进程,然后激活对象本身。服务器进程和目标对象的任
7、何激活对发出请求的客户来说都是透明的。持久对象:生存期超过创建或激活它们的某一特定进程的CORBA对象。除了持久对象外,其它的对象的生命周期由进程的生命周期甚至于创建它们的对象适配器来决定。,11.4.2 对象标识符,POA通过它的对象标识符识别每一个对象。对象标识符被赋值为ObjectId类型,这个类型在PortableServer模块中定义为octet的一个序列。一个程序可以显示的提供自己的对象标识符,也可以让POA为它创建对象标识符。对象标识符和对象引用的主要区别是在命名一个对象的POA作用域外,对象标识符是无意义的。在单个POA的作用域内,所有对象标识符必须是唯一的。如果使用具有SYS
8、TEM_ID策略值的POA,POA就会自动生成唯一的ID。如果使用具有USER_ID策略值的POA,POA就会通过产生异常来防止两个相同的ID。对象标识符由IdAssignmentPolicy来控制,11.4.3 对象到伺服程序之间的映射,一个只有少量几个暂态对象的应用程序在开始监听请求前,可能会为每个对象创建各自的伺服程序并使用POA注册它们。拥有多个持久CORBA对象的应用程序可能只需要一个伺服程序来具体化所有的这些对象。对象标识符映射到用UNIQUE_ID策略值创建的POA中的下伺服程序。当调用一个请求时,POA先提取出ObjectId,通常ObjectId嵌入在目标对象的对象引用中,然
9、后使用该ObjectId在激活的对象映射中查找目标对象的伺服程序。在激活的对象映射中的每一个条目由一个ObjectId和一个指向一个伺服程序的指针的关联组成。保留ObjectId对伺服程序关联的每一个POA都有它自己的激活的对象映射。对于UNIQUE_ID,POA实现的规则是每一个对象标识符映射到一个不同的伺服程序。而在一个MULTIPLE_ID中,多个对象标识符可以映射到一个伺服程序。对于Root POA,标准的对象标识符的唯一策略值是 UNIQUE_ID。Root POA要求一个独立的伺服程序来具体化每一个对象。,11.4.4 策略工厂操作,通过调用POA的策略工厂操作可以创建策略。POA
10、接口为每个类型都提供了一个独立的策略工厂操作。每一个策略工厂操作都一同样的方式工作:向新的策略对象传递所需的值,然后操作返回对象引用。最终,必须调用返回对象中的destroy操作来撤销它。,11.5 POA创建,为了让POA策略有效,在创建时就将它们应用于POA。通过调用另一个POA的create_POA可以创建一个POA。因为所有的服务器应用程序都有一个Root POA,所以它的create_POA操作起到了创建其它POA的起始点的作用。使用另一个POA创建的POA就成了正在创建的POA的子POA。但是,这对子POA的策略没有影响,策略并不继承符父POA。相反,如果没有策略值传递给creat
11、e_POA操作,则使用默认值。在IDL定义时需要注意:POAManager允许应用程序控制一个POA中的请求流。create_POA操作有三个参数。POA的名称、指向为要创建的POA控制请求流的POAManager的一个引用,为空将创建一个新的、创建POA策略列表。create_POA 操作可能会产生两个异常。同名AdapterAlreadyExists异常。策略未知或不一致InvalidPolicy,POA创建,POA策略的创建:CORBA:PolicyList policy_list PortableServer:POA_var child_poa=root_poa-create_POA(
12、“child”,PortableServer:POAManager:_nil(),policy_list)(1)先初始化ORB和从Root POA获得一个引用的一般调用序列(2)创建一个CORBA:PolicyList序列,默认为空(3)调用Root POA的create_POA,传递字符串“child”作为新的POA的名字,同时传递的参数还有一个空的POAManager引用和空的策略列表。也可以创建一分层的POA。例如:PortableServer:POA_var poa_A=root_poa-create_POA(“A”,)PortableServer:POA_var poa_B=poa_
13、A-create_POA(“B”,)PortableServer:POA_var poa_C=poa_B-create_POA(“C”,),11.6 Server IDL类型,native类型 native类型的目的是允许IDL标识符可以被说明为没有IDL定义的一种类型,但是这种类型可由每种语言映射来单独进行定义。在C+中,Servant类型映射到一个指向ServantBase类的指针。ServantBase可视为所有框架的基类,也就是所有应用程序伺服类的基类。ServantBase提供_default_POA函数,_default_POA函数的ServantBase实现返回一个指向Root
14、POA的引用。当调用一个伺服程序的_this函数来隐式创建并激活一个新的暂态CORBA时,_default_POA提供POA引用。,11.7 对象创建和激活,11.7.1 对象创建 POA提供两种不用创建伺服程序就可以创建CORBA对象的操作。create_refernce和create_refernce_with_id都需要一个RepositoryId参数来识别新对象支持的大多数派生的IDL接口。create_refernce操作要求POA具有一个值为SYSTEM_ID的IdAssignmentPolicy值,以便POA为新的对象生成ObjectId。如果没有,将会引发WrongPolicy
15、异常。使用create_refernce_with_id时,应用程序提供Object_Id。这个Object_Id在应用程序域内表示对象的身份。Object create_refernce(in CORBA:RepositoryId intf)raises(WrongPolicy);Object create_refernce_with_id(in ObjectId oid,CORBA:RepositoryId intf)raises(WrongPolicy);,对象创建和激活,11.7.2 伺服程序注册 激活一个对象的最简单方法之一就是使用POA对象激活操作。使用这些操作,应用程序开发人员显
16、式提供一个伺服程序来具体化将被激活的对象,并且根据POA的IdAssignmentPolicy,POA赋值一个ObjectId或应用程序开发人员提供一个ObjectId。根据目标POA的策略,选择使用active_object或activate_object_with_id。active_object操作要求目标POA具有值为SYSTEM_ID的一个IdAssignmentPolicy和值为RETAIN的一个ServerRetentionPolicy值。activate_object_with_id操作要求目标POA具有RETAIN的一个ServerRetentionPolicy值。如果POA
17、的IdUniquenessPolicy设置为UNIQUE_ID并且为一个参数传递Servant已经存在于POA的激活对象映射中,它们俩都将引发ServantAlreadyActive异常。,对象创建和激活,11.7.3 伺服程序管理器 具有USE_SERVANT_MANAGER策略的POA允许它们创建伺服程序来支持这些类型的应用程序,这些伺服程序参与确定对象对伺服程序关联的过程。伺服程序管理器有两种类型。(1)对于ServantRetention策略值是RETAIN的POA,伺服程序管理器对象必须支持ServantActivator接口。(2)对于策略值是NON_RETAIN的POA,伺服程序
18、管理器必须支持ServantLocator接口。伺服程序激活器(Servant Activators)ServantActivator接口提供incarnate和etherealize操作 incarnate操作用来实现或是创建一个伺服程序的一个合适的实例并返回它,或者产生一个异常。etherealize函数的功能刚好与incarnate函数相反。它允许应用程序清除它们的伺服程序。,对象创建和激活,伺服程序定位器(Servant Locators)对于使用USE_SERVANT_MANAGER和NON_ RETAIN策略的POA,伺服程序管理器必须支持ServantLoactor接口。此接口提
19、供了preinvoke和postinvoke操作。preinvoke函数用来获得一个要调度给请求的伺服程序。在请求返回后,POA调用postinvoke来让ServantLocator执行伺服程序清除或其后调用函数。直到POA涉及之前,由postinvoke返回的伺服程序只用于单个的请求。伺服程序管理器注册 因为伺服程序本身是CORBA对象,所以需要通过POA用它们的对象引用来注册它们,为伺服程序管理器创建一个对象引用的最容易的方法是隐式在Root POA注册它的伺服程序。PortableServer:ServantManage_var mgr_ref=manager_impl._this()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 移植 对象 适配器
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5248934.html