已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CORBA核心总体设计规划基于服务的ORB遵循公共ORB体系结构,可以有很多ORB的具体实现,比如客户与实现驻留ORB,基于服务的ORB,基于系统的ORB以及基于链接库的ORB等。考虑到我们今后利用本平台所作开发项目的具体情况以及我们目前的开发条件与能力,决定选用基于服务的ORB为开发目标。这种基于服务的ORB,对ORB进行集中式管理,所有的客户实现均可以与一个或多个服务器进行通信,这些服务器的功能是将请求从客户端发送到实现端。这样的话,ORB就可以做成一个普通的程序,以便运行在不同的平台上。总体结构客户对象实现ORB核心动态调用ORB接口可移植对象适配器用于所有ORB实现的同一接口可能有多个对象适配器上调用下调用总体结构图本系统所采用的实现方法为:客户通过动态调用接口与ORB接口经ORB核心与具体的对象实现进行交互。具体结构如下图所示:参照CORBA 2.3规范,本系统工作原理如下: 客户首先通过ORB核心提供的ORB接口得到一个对象引用。至于得到一个什么样的对象引用,取决于客户需要的服务。通常每个服务都会有一个标识,客户就是通过这个标识来识别每一个服务的。也就是说,客户首先要向ORB核心提交一个服务标识来请求一种服务。 ORB核心在得到客户提供的服务标识之后,从它掌握的各个对象适配器(POA)中处于活跃状态的对象实现(服务提供者)中挑选一个。本系统中,ORB核心是通过查询一个POA、对象实现(服务标识)列表来完成这一功能的。这样的话,ORB核心返回给客户的对象引用具体地说就是该服务与POA对在本核心所持有列表中的位置。 ORB核心又是怎么得到并维护这个POA与服务标识的列表的呢?这个列表的创建与修改都是通过POA来完成的,因为与对象实现(服务提供者)直接交互的是POA,而不是ORB核心。对于服务是否可用的状态维护,本系统考虑了两种情况:一是ORB先于对象实现而运行;二是对象实现先于ORB而运行。其实这里所说的ORB主要是指ORB中的POA。第一种情况下,由对象实现在启动的时候主动向POA完成注册登记,即通过POA写入该列表;第二种情况下,由ORB在初始化的时候,通知POA搜寻所有已经注册过的对象实现(服务提供者),并把可用的服务记入该列表。 对象实现为了与对象适配器交互,也需要完成一个接口程序,也即仆从程序。它的作用主要是与POA联系并把POA传送过来的操作在本地实现并将执行结果返回给POA。数据流图在本系统中数据流与事务流图紧密相关,而且对于所有的请求与调用而言几乎都是一样的,这是由CORBA的定义所决定的。客户ORB核心对象实现数据流图其中,客户提交的数据是以对象引用为标识的。为了保证动态调用的实现,在本系统中客户与ORB核心是在同一应用实体内的。但对于对象实现而言,则不一定要与ORB核心在同一应用实体内。功能模块划分为了有条不紊地实现整个系统,规划与开发的时候,可以把它划分为以下几个功能模块:1、 ORB接口String object_to_string (in Object obj);Object string_to_object (in string str); 与ORB初始化相关的操作ORB ORB_init(incout arg_list argv, in ORBid orb_identifier); 与动态调用相关的操作void create_list (in long count, out NVList new_list);void create_operation_list (in OperationDef oper, out NVList new_list); /暂时不用void get_default_context (out Context ctx); /暂时不用void send_multiple_requests_oneway (in RequestSeq req);void send_multiple_requests_deferred (in RequestSeq req);boolean poll_next_response ();void get_next_response (out Request req); 与初始引用相关的操作Object resolve_initial_references (in ObjectId identifier) raises (InvalidName);2、 动态调用接口 请求操作void add_arg (in Identifier name, in TypeCode arg_type, in Opaque Value value, in long len, in Flags arg_flags);void invoke (in Flags invoke_flags);void delete ();void send (in Flags invoke_flags);void get_response () raises (WrongTransaction); 延迟同步操作 /定义于ORB接口部分void send_multiple_requests_oneway (in RequestSeq req);void send_multiple_requests_deferred (in RequestSeq req);boolean poll_next_response ();void get_next_response (out Request req); 列表操作void add_item (in Identifier item_name, in TypeCode item_type, in OpaqueValue value, in long value_len, in Flags item_flags);void free ();void free_memory ();void get_count (out long count);3、 POA POA管理器接口void activate () raise (AdapterInactive);void hold_requests (in boolean wait_for_completion) raises (AdapterInactive);void discard_requests (in b9oolean wait_for_completion) raises (AdapterInactive);void deactivate (in Boolean etherealize_objects, in Boolean wait_for_completion) raises (AdapterInactive);State get_state(); 仆从激活器接口Servant incarnate (in ObjectId oid, in POA adapter) raises (ForwardRequest);void etherealize (in O(bjectId oid, in POA adapter, in Servant serv, in Boolean cleanup_in_progress, in Boolean remaining_activations); POA接口POA create_POA (in string adapter_name, in POAManager a_POAManager, in CORBA:PolicyList policies) raises (Adapter AlreadyExists, InvalidPolicy);POA find_POA (in string adapter_name, in Boolean activate_it) raises (AdapterNonExistent);Void destroy ( in Boolean etherealize_objects, in Boolean wait_for_completion); 仆从管理器注册ServantManager get_servant_manager() raises (WrongPolicy); 对象激活与去活ObjectId activate_object (in Servant p_servant) raises (ServantAlreadyActive, WrongPolicy);void activate_object_with_id (in ObjectId id, in Servant p_servant) raises (ServantAlreadyActive, ObjectAlreadyActive, WrongPolicy);void deactivate_object (in ObjectId oid) raises (ObjectNotActive, WrongPolicy); 对象引用的创建操作Object create_reference (in CORBA:RepositoryId intf) raises (WrongPolicy);Object create_reference_with_id (in ObjectId oid, 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, WrongPolicy);Servant reference_to_servant(in Object reference)raises(ObjectNotActive, 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 oid)raises (ObjectNotActive, WrongPolicy);4、 仆从程序native servant;5、 简单应用公共数据结构1、Named Value类型typedef unsigned long Flags;struct NamedValue Identifier name; /Identifier其实就是string类型,name指的是该变量的名称any argument; /any类型的参数,本系统中可能会采用较简单的any类型实现方法long len; /参数的长度Flags arg_modes; /参数的传递方向,可能包含的值有:CORBA:ARG_IN表示该参数/的值是需要输入的;CORBA:ARG_OUT表示该参数的值是用来输/出的;CORBA:ARG_INOUT表示既可向该参数输入值也可用该参/数输出值。1在本数据结构中,any类型包括了两个部分:一个是TypeCode,另一个就是指向数据值的指针。而len参数值指的是数据值所占用的实际字节数。对象引用的len是1.一般情况下,len值需要与TypeCode相一致,如果不一致的话该NamedValue结构就是无效的。2、NVList接口这个接口所表示的是一个列表,但其每一条所用的数据结构其实就是上面描述的Named Value类型。Module CORBA interface NVList void add_item (in Identifier item_name, /列表中条目的名称,相当于参数名称in TypeCode item_type, /条目的数据类型,相当于参数类型in OpaqueValue value, /条目的值,相当于参数值in long value_len, /条目值的长度,相当于参数长度in Flags item_flags /条目标识);void free ();void free_memory ();void get_count (out long count); ;关于本接口中相关接口函数的说明,将在接下来的“动态调用接口”中介绍。3、对象引用接口module CORBA interface Object boolean is_nil();Object duplicate();Void release ();Boolean non_existent ();Void create_request ( in Context ctx,in Identifier operation,in NVList arg_list,inout NamedValue result,out Request request,in Flags req_flag);Policy get_policy (in PolicyType policy_type);在这个接口中,is_nil函数的作用是检测当前对象引用所指的对象是否还处于可用状态,主要是检测对象引用是否有对象可指,不过这种判断不涉及对象实现;non_existent函数用于检验对象引用所指的对象存在与否,这种判断与对象实现相关,true则表示对象已经不存在了;duplicate函数的作用是为当前对象引用创建副本,不过,这种操作对于对象实现来说是没有丝毫意义的,即对象引用是原件还是副本对于对象实现来说都是一样的;release函数的作用就是释放当前对象引用所占用的资源,并删除当前对象引用,这个操作不涉及对象实现,也不影响对象本身与对象的任何其他引用。create_request函数用于创建一个ORB请求,但它不会发生真正的(对ORB的)调用,它只是准备好待发送的请求而已,真正对ORB的调用在ORB接口与动态调用接口部分将进行介绍。参数ctx指明了当前的上下文。operation参数则用于指明在对象上进行的操作的名称。如果对于任一的对象引用自身的操作生成一个请求,则operation的值必须要是以“_”加该操作名。例如,要生成“is_a”的动态调用请求,则operation的值必须为“_is_a”。而arg_list中则是与请求相关联的参数列表,如果这个参数为null则需要反复调用add_arg操作来把参数与请求相关联。注意,这两种方式的效果是一样的,但却不能混着用,即如果你使用了参数列表,就不能用add_arg来增加参数;同样,如果你要用add_arg来添加参数就不能指定参数列表。而result参数中所存放的则是操作的结果。参数request则是本次操作产生的请求,用于对ORB进行调用。参数req_flags被定义为一个位掩码,可能的值为CORBA:OUT_LIST_MEMORY或null。如果被指定为CORBA:OUT_LIST_MEMORY则必须在create_rquest调用上指定一个参数列表,且释放这个列表结构的同时,需要释放与之相关联的所有参数内存。如果被指定为空,则需要程序显式地释放参数所占用的内存。详细说明-ORB接口1. String object_to_string (in Object obj)这个函数的作用是把对象引用转换为字符串的形式以便于在ORB之间传送。2. Object string_to_object (in string str)这个函数的作用与上个函数相反,它是把一个字符串形式表示的对象引用转换为本地ORB可识别的对象引用。3. ORB ORB_init(incout arg_list argv, in ORBid orb_identifier)这个函数的作用是初始化ORB,为应用作好准备。参数argv是一个字符串序列,用于向ORB提供一些有意义的参数值,本系统中暂时为空。参数orb_identifier用于标识该ORB,其类型ORBid其实就是string。4. void create_list (in long count, out NVList new_list)本函数的作用是创建一个NVList类型的列表。这种列表在第一次使用的时候需要清空。本函数中的参数count需要在调用的时候赋值,用来在创建列表的时候指定其长度。参数new_list是本函数的返回值,即返回一个NVList类型的值。5. void create_operation_list (in OperationDef oper, out NVList new_list) /暂时不用本函数用于创建一个操作列表。顾名思义,操作列表就是一系列操作的列表。为什么需要把待完成的操作放在一个列表中呢?因为要请求一个服务往往不仅仅是一个操作就能完成的,既然这样的话,一次提交一系列不相关的、可以同时进行的操作给服务提供者,不仅可以提高效率,也可以简化编程步骤。与create_list函数一样,本函数的返回值new_list也是一个NVList类型的值。不同点就在于,create_list返回的是一个空列表,而本函数返回的是一个被初始化了的列表。而参数oper其实就是一个操作,其类型OperationDef就是用来描述操作的,定义如下:module CORBA enum OperationMode OP_NORMAL, OP_ONEWAY;enum ParameterMode PARAM_IN, PARAM_OUT, PARAM_INOUT;struct ParameterDescription /用于描述操作所带的参数Identifier name; /参数名TypeCode type; /参数类型的类型码IDLType type_def; /标识参数类型的定义ParameterMode mode; /参数模式,见上;typedef sequence ParDescriptionSeq;typedef Identifier ContextIdentifier; /暂时不用typedef sequence ContextIdSeq; /暂时不用typedef sequence ExceptionDefSeq; /暂时不用typedef sequence ExcDescriptionSeq; /暂时不用interface OperationDef : Contained readonly attribute TypeCode result; /返回值的类型的类型码attribute IDLType result_def; /用来标识返回类型的定义attribute ParDescriptionSeq params; /参数描述序列attribute OperationMode mode; /操作模式,见上attribute ContextIdSeq contexts; /暂时不用attribute ExceptionDefSeq exceptions; /暂时不用;struct OperationDescription Identifier name; /操作名称RepositoryId id; /暂时不用RepositoryId defined_in; /暂时不用VersionSpec version; /版本标识TypeCode result; /返回值类型的类型码OperationMode mode; /操作模式,见上ContextIdSeq contexts; /暂时不用ParDescriptionSeq parameters; /参数序列ExcDescriptionSeq exceptions; /暂时不用;对于本接口定义中所涉及到的一些类型与基接口的定义将在接口库部分给出。6. void get_default_context (out Context ctx)/暂时不用7. void send_multiple_requests_oneway (in RequestSeq req)根据请求中的信息并行地发起多个请求,但是,它不等到操作完成就返回给调用者了。而且调用者也不会收到完成与否的指示,也不能调用其它操作以获得其操作结果。8. void send_multiple_requests_deferred (in RequestSeq req)根据请求中的信息并行地发起多个请求,同样不等操作完成就返回给调用者了。但调用者可以用get_net_response操作以获得其执行结果。9. boolean poll_next_response ()判断请求是否完成。返回值为true则表示至少有一个请求已经完成;返回值为false则表示请求还没有完成。不管理请求是否完成,本函数都会立即返回给调用者。10. void get_next_response (out Request req);本函数的作用是返回完成的下一个请求,但它不保证请求完成的顺序。11. Object resolve_initial_references (in ObjectId identifier) raises (InvalidName)本函数的作用是根据提供的ObjectId类型(即string)的identifier,找到符合条件的、当前可用的对象,并得到该对象的引用。查找的时候,主要是看该对象的标识是否与提供的对象标识(identifier)相一致。详细说明-动态调用接口1. 请求操作1) void add_arg (in Identifier name, in TypeCode arg_type, in OpaqueValue value, in long len, in Flags arg_flags)用于向请求逐步添加参数。对于每个参数,至少要指定它的value与len。也可以指定它名称、类型与使用标识(如输入,输出及输入输出)。如果所有的项都指定了,则服务实现方的参数验证将按照其参数集来检验所有的项。不过,有一点,请求所带参数列表中参数的顺序不一定要严格按照操作所要求的顺序。经过本函数加入到请求中的参数在调用完成或请求被删除后即被释放。除了“公共数据结构”中定义的参数模式,arg_flags也可以取标志值:IN_COPY_VALUE。如果设置了本标志,则产生并使用参数值的一份拷贝,不过,对于输入输出与输出参数则忽略该标志。2) void invoke (in Flags invoke_flags);此函数调用ORB,由ORB进行函数解析并调用相关函数来完成本请求。此函数的最大特点就是需要等待所请求操作被完成,返回的结果放在请求的result参数中。本函数的参数invoke_flags就是一个调用标识,没有任何确定的意义,可以参考send中的参数说明。3) void delete ();此函数的作用是用来删除请求。与请求相关联的所有内存(包括,通过使用IN_COPY_VALUE标志引用的参数)。4) void send (in Flags invoke_flags);本函数根据请求的信息起一个操作。与invoke不同,send不需要等操作结束就把控制返回给调用者。为了判断操作何时完成,调用必须使用get_response或者get_next_response操作。在操作完成前不得使用输出参数与返回值。其调用标志,即参数invoke_flags,被定义为CORBA:INV_NO_RESPONSE,表示调用者既不想等待响应,也不期望任何输出参数被更新。5) void get_response () raises (WrongTransaction);本函数返回一个请求的结果。如果在请求结束之前调用本函数,它将被阻塞,直到请求完成为止。在返回时,操作结果被设置在请求中定义的输出参数与返回值中,如result参数。2. 延迟同步操作-已经在前面介绍过了3. 列表操作1) void add_item (in Identifier item_name, in TypeCode item_type, in OpaqueValue value, in long value_len, in Flags item_flags);本函数的作用是将一个新条目加入到指定的列表中。新加入的条目被加在前一个加入的条目的后面。列表中的数据保存结构就是NamedValue结构。本函数的参数与NamedValue结构中的各个成员相对应。需要注意的是,item_type与value这两个成员一起对应着NamedValue中的argument参数。2) void free ();这个操作释放列表结构与任何相关联的内存(隐式调用free_memory操作)。3) void free_memory ();这个操作释放所有动态分配的与列表相关联的输出参数内存。但不释放列表结构本身。4) void get_count (out long count);这个参数返回加入到这个列表中的所有条目的总数。详细说明-接口库(部分)对于接口库,目前只实现其中很小的一个部分。因为本系统采用动态调用接口来实现与ORB的交互,而不用实现静态根程序框架,故省略接口库中大部分的内容。也就是说,本系统暂时把接口的定义与框架留给用户自己去完成。module CORBA enum TCKind tk_null, tk_void, tk_short, tk_long, tk_ushort, tk_ulong, tk_float, tk_double, tk_boolean, tk_char, tk_octet, tk_any, tk_TypeCode, tk_Principal, tk_objref, tk_struct, tk_union, tk_enum, tk_string, tk_sequence, tk_array, tk_alias, tk_except, tk_longlong, tk_ulonglong, tk_longdouble, tk_wchar, tk_wstring, tk_fixed, tk_value, tk_value_box, tk_native, tk_abstract_interface;typedef short ValueModifier;const ValueModifier VM_NONE = 0;const ValueModifier VM_CUSTOM = 1;const ValueModifier VM_ABSTRACT = 2;const ValueModifier VM_TRUNCATABLE = 3;interface TypeCode exception Bounds ; /暂时不用exception BadKind ; /暂时不用/ for all TypeCode kindsboolean equal (in TypeCode tc);boolean equivalent(in TypeCode tc);TypeCode get_compact_typecode();TCKind kind ();详细说明-可移植对象适配器1. POA管理器接口1) POA管理器状态转换图2) void activate () raise (AdapterInactive)这个操作将POA管理器的状态改变为活跃。不过,并不是在POA管理器的任何状态都可以进行这个操作的。如果当POA管理器处于终止状态时,进行这个操作就会引发异常。当POA管理器处于这个状态的时候,相关的POA就可以处理对它的请求。3) void hold_requests (in boolean wait_for_completion) raises (AdapterInactive)本函数的作用是把POA管理器的状态转为保持。处于保持状态的POA不会处理对它的请求,但会把到来的请求排队,并按先后顺序处理。参数wait_for_completion的作用是用来指定本操作的返回方式的。如果该参数的值为false则本操作在改变POA管理器的状态之后立刻就返回。如果其值为true,则本操作不会立刻返回,而是要等到与此POA管理器相关的任何POA中都没有正在主动执行的请求(也即,在状态改变之前发出的所有请求都已经完成)或者POA管理器的状态被改变为保持以外的状态。如果当POA管理器处于终止状态时进行这个操作,就会引发AdapterInactive异常。4) void discard_requests (in b9oolean wait_for_completion) raises (AdapterInactive)这个操作将POA管理器的状态改变为丢弃状态。进入丢弃状态后,与此POA管理器相关的POA将丢弃进来的请求。此外,任何已经排队但是没有开始执行的请求都将被丢弃,正在执行的请求则将继续进行。不过,在请求被丢弃的时候,将返回一个TRANSIENT系统异常给客户。参数wait_for_completion所表示的意义与hold_requests操作中一样。如果为false,则这个操作在改变了状态之后立刻就返回。如果为true,就不会立刻返回,直到与这个POA管理器相关的任何POA中都没有正在主动执行的请求(也即,在状态改变之前发出的所有请求都已经完成),或者POA管理器的状态被改变为丢弃以外的状态。当POA管理器处于终止状态时,执行这个操作会引发AdapterInactive异常。5) void deactivate (in Boolean etherealize_objects, in Boolean wait_for_completion) raises (AdapterInactive)这个操作将POA管理器的状态改变为终止。进入终止状态将导致相关的POA拒绝还没有开始执行的请求,就像任何新的请求一样。改变状态后,再判断etherealize_objects参数的值。如果为true,POA管理器则使具有RETAIN策略的所有相关的POA对所有活跃对象的相关仆从管理器执行etherealize操作。如果为false,则不必调用etherealize操作。对于wait_for_completion参数的取值与前两个一样。如果为false,则这个操作在改变了状态之后就立刻返回。如果为true,则不会立刻返回,而是等到与这个POA相关的所有POA中都没有正在主动执行的请求(即,在状态改变之前发出的所有请求都已经完成),并且,在etherealize_objects为true的情况下,对于所有有RETAIN策略的POA,etherealize的所有调用都已完成。当POA管理器处于终止状态时进行这个操作的话,就会引发AdapterInactive异常。6) State get_state();这个操作返回POA管理器的当前状态。2. 仆从激活器接口1) Servant incarnate (in ObjectId oid, in POA adapter) raises (ForwardRequest)这个操作的作用就是激活仆从,它返回的就是已经激活的仆从。Oid参数包括与进来的请求相关的ObjectId值。adapter就是被请求对象所在POA的对象引用。用户提供的仆从管理器实现负责定位或创建一个适当的仆从,该仆从对应于ObjectId值。本函数返回一个Servant类型的值,也就是用来处理即将进来的(也可能包括随后到来的请求,因为POA有RETAIN策略)请求的仆从。2) void etherealize (in ObjectId oid, in POA adapter, in Servant serv, in Boolean cleanup_in_progress, in Boolean remaining_activations)这个函数的作用就是终止活跃仆从。具有RETAIN策略时,每个对象的仆从被终止时,都会调用这个操作。注意,活跃仆从可以由仆从管理器通过本函数终止,即使它并不曾由这个仆从管理器实体化(激活)。Oid参数包括终止的对象的ObjectId值,adapter参数是对象所在POA的一个对象引用。Serv参数包括被终止仆从的引用。如果serv参数表示的仆从与adapter参数表示的POA中的其他对象相关(即,在POA的活跃对象映射中),在调用etherealize时,remaining_activations参数就有true值。否则,为false值。如果cleanup_in_progress参数是true,则调用etherealize操作的原因就是用带有true的etherealize_objects参数调用了deactivate或者destroy操作。如果为false,就是由其他原因被调用的。通常情况下,调用本函数的原因有:a. 由于对象调用了POA:deactivate_object操作,需要显示终止仆从;b. ORB或者是POA内部决定了对象必须被终止;c. 与对象所在POA相关的POA管理器调用了POAManager:deactivate操作。注意:不要轻易销毁一个活跃对象映射中的或是被POA所知的仆从,这将导致不确定的结果。3. POA接口1) POA create_POA (in string adapter_name, in POAManager a_POAManager, in CORBA:PolicyList policies) raises (Adapter AlreadyExists, InvalidPolicy)这个操作创建一个新POA作为目标POA的子POA。指定的名字用于区分这个新POA与其他有同一父POA的POA。如果目标POA已经有一个叫这个名字的子POA,则引发AdapterAlreadyExists异常。如果参数a_POAManager参数为空,就创建一个新POAManager对象并与新POA相关联。否则,指定的POAManager对象就与新POA相关。2) POA find_POA (in string adapter_name, in Boolean activate_it) raises (AdapterNonExistent)如果目标POA是带有指定名字的子POA(相对于目标POA)的父POA,则返回那个子POA。如果这个POA不存在,就引发AdapterNonExistent异常。3) Void destroy ( in Boolean etherealize_objects, in Boolean wait_for_completion)这个操作销毁POA及其所有的后代POA。后代POA需要在包容它的POA销毁之前被(递归地)销毁。不过,被销毁的POA在被重新创建之前不允许再次被销毁。在调用了destroy后,POA的行为如下:a. POA对其所有的直接后代调用destroy;b. 在所有后代POA已被销毁及其仆从灵化之后,POA继续处理请求直到在POA中已没有请求可执行。c. 如果etherealize_objects参数是true,POA有RETAIN策略,且有一个仆从管理器向这个POA注册,则仆从管理器上的etherealize操作将被活跃对象映射中的每个活跃对象调用。wait_for_completion参数的处理如下:a. 如果wait_for_completion参数是true,则destroy操作需要在所有活跃请求已完成,且所有etherealize的调用已完成之后,才返回。b. 如果wait_for_completion参数是false,则destroy操作销毁POA与其子POA,但不等待活跃请求完成,也不等待灵化的发生。4. 仆从管理器注册1) ServantManager get_servant_manager() raises (WrongPolicy)这个操作返回与POA相关联的仆从管理器。如果这个POA没有与任何仆从管理器联系,它就返回一个空引用。5. 对象激活与去活1) objectId activate_object (in Servant p_servant) raises (ServantAlreadyActive, WrongPolicy)本操作为指定的仆从产生一个ObjectId,并输入ObjectId与指定仆从到活跃对象映射中,ObjectId被返回。2) void activate_object_with_id (in ObjectId id, in Servant p_servant) raises (ServantAlreadyActive, ObjectAlreadyActive, WrongPolicy)本操作的作用就是在活跃对象映射表中输入一个指定ObjectId的指定仆从之间的对应关系。3) void deactivate_object (in ObjectId oid) raises (ObjectNotActive, WrongPolicy)这个操作用于终止由oid参数指定的ObjectId。不过,在终止这个ObjectId之前,必须等到它执行完对它的所有请求。除了把该ObjectId从对象映射表上去掉之外,还需要调用ServantActivator:etherealize操作。6. 对象引用的创建操作1) Object create_reference_with_id (in ObjectId oid, CORBA:RepositoryId intf) raises (WrongPolicy)这个操作创建一个封装了指定的ObjectId与接口库Id值(暂时为null)的对象引用。不过,这个操作不会导致对对象的激活操作。创建出的引用可以传递给客户机,至于是否激活要看所采用的策略。本系统中一旦创建就需要激活它。7. 标识映射操作1) ObjectId servant_to_id (in Servant p_servant) raises (ServantNotActive, WrongPolicy)由于本系统采用UNIQUE_ID策略,所以如果本操作指定的仆从活跃,则返回与该仆从相关联的ObjectId。否则,引发ServantNotActive异常。2) Object servant_to_reference(in Servant p_servant) raises (ServantNotActive, WrongPolicy)由于本系统采用RETAIN与UNIQUE_ID策略,所以如果指定的仆从活跃,则返回用于激活该仆从的对象引用。否则,返回ServantNotActive异常。3) Servant reference_to_servant(in Object reference)raises(ObjectNotActive, Wrongpolicy)由于本系统采用RETAIN策略,所以如果指定的对象引用出现在活跃对象映射中,这个操作就返回活跃对象映射中与那个对象引用相关的仆从。如果对象引用不是由这个POA创建的,则引发WrongAdapter异常。4) ObjectId reference_to_id(in Object reference)raises (WrongAdapter, WrongPolicy)这个操作返回由指定的对象引用封装的ObjectId值。注意,为了让操作继续进行,引用所表示的对象并不一定要处于活跃状态。如果对象引用不是由该POA创建的,则引发一个WrongAdapter异常。5) Servant id_to_servant(in ObjectId oid)raises (ObjectNotActive, WrongPolicy)由于本系统采用RETAIN策略,所以如果指定的ObjectId在活跃对象映射表上,那么这个操作就返回与活跃对象映射表的对象相关的仆从。否则,引发OBJECT_NOT_ACTIVE异常。6) Object id_to_reference(in ObjectId oid)raises (Objec
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年长春汽车工业高等专科学校高职单招笔试综合素质历年参考题库含答案解析
- 2026年铁岭卫生职业学院高职单招笔试职业技能测验历年参考题库含答案解析
- 2026年重庆电讯职业学院高职单招笔试化学历年参考题库含答案解析
- 2026年重庆师范大学涉外商贸学院高职单招笔试英语历年参考题库含答案解析
- 2026年重庆人文科技学院高职单招笔试综合素质历年参考题库含答案解析
- 2026年邢台医学高等专科学校高职单招笔试职业适应性测验历年参考题库含答案解析
- 2026年贵州职业技术学院高职单招笔试综合素质历年参考题库含答案解析
- 2026年贵州农业职业学院高职单招笔试职业技能测验历年参考题库含答案解析
- 2026年西安思源学院高职单招笔试综合素质历年参考题库含答案解析
- 2026年苏州工业园区服务外包职业学院高职单招笔试数学历年参考题库含答案解析
- 新版2026秋新苏教版小学科学五年级上册全册知识点考点合集
- 2027兴业银行校园招聘笔试参考题库及答案详解
- ASME B31.3-2024 中文版(工艺管道规范 引用 ASME V 卷无损检测要求)
- 武汉产业投资控股集团有限公司招聘笔试参考题库及答案详解
- 2026年海南发展控股公司招聘试题及答案
- 2025年山东公务员考试行测真题完整版(含答案+详细解析)
- 喷涂工序低温烘干控制规范
- 社会保障资金管理信息系统一体化社保模块项目采购需求
- 第10课《 一元钱的体验》课件【海燕版】综合实践活动 四年级下册
- 化工职称考试试题及答案
- 快速康复外科理念ERAS与围手术期护理课件
评论
0/150
提交评论