CORBA原理简介与实例.docx

上传人:小飞机 文档编号:3154794 上传时间:2023-03-11 格式:DOCX 页数:69 大小:66.49KB
返回 下载 相关 举报
CORBA原理简介与实例.docx_第1页
第1页 / 共69页
CORBA原理简介与实例.docx_第2页
第2页 / 共69页
CORBA原理简介与实例.docx_第3页
第3页 / 共69页
CORBA原理简介与实例.docx_第4页
第4页 / 共69页
CORBA原理简介与实例.docx_第5页
第5页 / 共69页
亲,该文档总共69页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《CORBA原理简介与实例.docx》由会员分享,可在线阅读,更多相关《CORBA原理简介与实例.docx(69页珍藏版)》请在三一办公上搜索。

1、CORBA原理简介与实例CORBA核心总体设计规划 基于服务的ORB 遵循公共ORB体系结构,可以有很多ORB的具体实现,比如客户和实现驻留ORB,基于服务的ORB,基于系统的ORB以及基于链接库的ORB等。考虑到我们今后利用本平台所作开发项目的具体情况以及我们目前的开发条件与能力,决定选用基于服务的ORB为开发目标。 这种基于服务的ORB,对ORB进行集中式管理,所有的客户实现均可以与一个或多个服务器进行通信,这些服务器的功能是将请求从客户端发送到实现端。这样的话,ORB就可以做成一个普通的程序,以便运行在不同的平台上。 总体结构 本系统所采用的实现方法为:客户通过动态调用接口和ORB接口经

2、ORB核心与具体的对象实现进行交互。具体结构如下图所示: 客户 对象实现 动态调用 ORB接口 ORB核心 可移植对象适配器 用于所有ORB实现的同一接口 可能有多个对象适配器 总体结构图 上调用 下调用 参照CORBA 2.3规范,本系统工作原理如下: 客户首先通过ORB核心提供的ORB接口得到一个对象引用。至于得到一个什么样的对象引用,取决于客户需要的服务。通常每个服务都会有一个标识,客户就是通过这个标识来识别每一个服务的。也就是说,客户首先要向ORB核心提交一个服务标识来请求一种服务。 ORB核心在得到客户提供的服务标识之后,从它掌握的各个对象适配器中处于活跃状态的对象实现中挑选一个。本

3、系统中,ORB核心是通过查询一个POA、对象实现列表来完成这一功能的。这样的话,ORB核心返回给客户的对象引用具体地说就是该服务与POA对在本核心所持有列表中的位置。 ORB核心又是怎么得到并维护这个POA与服务标识的列表的呢?这个列表的创建与修改都是通过POA来完成的,因为与对象实现直接交互的是POA,而不是ORB核心。对于服务是否可用的状态维护,本系统考虑了两种情况:一是ORB先于对象实现而运行;二是对象实现先于ORB而运行。其实这里所说的ORB主要是指ORB中的POA。第一种情况下,由对象实现在启动的时候主动向POA完成注册登记,即通过POA写入该列表;第二种情况下,由ORB在初始化的时

4、候,通知POA搜寻所有已经注册过的对象实现,并把可用的服务记入该列表。 对象实现为了与对象适配器交互,也需要完成一个接口程序,也即仆从程序。它的作用主要是与POA联系并把POA传送过来的操作在本地实现并将执行结果返回给POA。 数据流图 在本系统中数据流与事务流图紧密相关,而且对于所有的请求与调用而言几乎都是一样的,这是由CORBA的定义所决定的。 客户 ORB核心 数据流图 其中,客户提交的数据是以对象引用为标识的。为了保证动态调用的实现,在本系统中客户与ORB核心是在同一应用实体内的。但对于对象实现而言,则不一定要与ORB核心在同一应用实体内。 功能模块划分 为了有条不紊地实现整个系统,规

5、划与开发的时候,可以把它划分为以下几个功能模块: 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

6、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_initi

7、al_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 ra

8、ises (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

9、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

10、_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,

11、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) rai

12、ses (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

13、(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

14、 (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 Wrongpolicy); Objec

15、tId reference_to_id(in WrongPolicy); Object Object reference)raises(ObjectNotActive, reference)raises (WrongAdapter, Servant id_to_servant(in ObjectId oid)raises (ObjectNotActive, WrongPolicy); Object id_to_reference(in ObjectId oid)raises (ObjectNotActive, WrongPolicy); 4、 仆从程序 native servant; 5、 简

16、单应用 公共数据结构 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表

17、示既可向该参数输入值也可用该参 /数输出值。1 在本数据结构中,any类型包括了两个部分:一个是TypeCode,另一个就是指向数据值的指针。而len参数值指的是数据值所占用的实际字节数。对象引用的len是1.一般情况下,len值需要与TypeCode相一致,如果不一致的话该NamedValue结构就是无效的。 2、NVList接口 这个接口所表示的是一个列表,但其每一条所用的数据结构其实就是上面描述的Named Value类型。 Module CORBA interface NVList void add_item ( in Identifier item_name, /列表中条目的名称,相

18、当于参数名称 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_n

19、il; 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函数的作用是检测当前对象引用所指的对象是否还处于可用状

20、态,主要是检测对象引用是否有对象可指,不过这种判断不涉及对象实现;non_existent函数用于检验对象引用所指的对象存在与否,这种判断与对象实现相关,true则表示对象已经不存在了;duplicate函数的作用是为当前对象引用创建副本,不过,这种操作对于对象实现来说是没有丝毫意义的,即对象引用是原件还是副本对于对象实现来说都是一样的;release函数的作用就是释放当前对象引用所占用的资源,并删除当前对象引用,这个操作不涉及对象实现,也不影响对象本身和对象的任何其他引用。 create_request函数用于创建一个ORB请求,但它不会发生真正的调用,它只是准备好待发送的请求而已,真正对O

21、RB的调用在ORB接口和动态调用接口部分将进行介绍。参数ctx指明了当前的上下文。operation参数则用于指明在对象上进行的操作的名称。如果对于任一的对象引用自身的操作生成一个请求,则operation的值必须要是以“_”加该操作名。例如,要生成“is_a”的动态调用请求,则operation的值必须为“_is_a”。而arg_list中则是与请求相关联的参数列表,如果这个参数为null则需要反复调用add_arg操作来把参数与请求相关联。注意,这两种方式的效果是一样的,但却不能混着用,即如果你使用了参数列表,就不能用add_arg来增加参数;同样,如果你要用add_arg来添加参数就不能

22、指定参数列表。而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) 这个函数的作用是把对象引用转换为字符

23、串的形式以便于在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_li

24、st (in long count, out NVList new_list) 本函数的作用是创建一个NVList类型的列表。这种列表在第一次使用的时候需要清空。本函数中的参数count需要在调用的时候赋值,用来在创建列表的时候指定其长度。参数new_list是本函数的返回值,即返回一个NVList类型的值。 5. void create_operation_list (in OperationDef oper, out NVList new_list) /暂时不用 本函数用于创建一个操作列表。顾名思义,操作列表就是一系列操作的列表。为什么需要把待完成的操作放在一个列表中呢?因为要请求一个服务

25、往往不仅仅是一个操作就能完成的,既然这样的话,一次提交一系列不相关的、可以同时进行的操作给服务提供者,不仅可以提高效率,也可以简化编程步骤。 与create_list函数一样,本函数的返回值new_list也是一个NVList类型的值。不同点就在于,create_list返回的是一个空列表,而本函数返回的是一个被初始化了的列表。而参数oper其实就是一个操作,其类型OperationDef就是用来描述操作的,定义如下: module CORBA enum OperationMode OP_NORMAL, OP_ONEWAY; enum ParameterMode PARAM_IN, PARAM

26、_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

27、 ExceptionDefSeq; /暂时不用 typedef sequence ExcDescriptionSeq; /暂时不用 interface OperationDef : Contained readonly attribute TypeCode result; /返回值的类型的类型码 attribute IDLType result_def; /用来标识返回类型的定义 attribute ParDescriptionSeq params; /参数描述序列 attribute OperationMode mode; /操作模式,见上 attribute ContextIdSeq co

28、ntexts; /暂时不用 attribute ExceptionDefSeq exceptions; /暂时不用 ; struct OperationDescription Identifier name; /操作名称 RepositoryId id; /暂时不用 RepositoryId defined_in; /暂时不用 VersionSpec version; /版本标识 TypeCode result; /返回值类型的类型码 OperationMode mode; /操作模式,见上 ContextIdSeq contexts; /暂时不用 ParDescriptionSeq para

29、meters; /参数序列 ExcDescriptionSeq exceptions; /暂时不用 ; ; 对于本接口定义中所涉及到的一些类型与基接口的定义将在接口库部分给出。 6. void get_default_context (out Context ctx) /暂时不用 7. void send_multiple_requests_oneway (in RequestSeq req) 根据请求中的信息并行地发起多个请求,但是,它不等到操作完成就返回给调用者了。而且调用者也不会收到完成与否的指示,也不能调用其它操作以获得其操作结果。 8. void send_multiple_requ

30、ests_deferred (in RequestSeq req) 根据请求中的信息并行地发起多个请求,同样不等操作完成就返回给调用者了。但调用者可以用get_net_response操作以获得其执行结果。 9. boolean poll_next_response 判断请求是否完成。返回值为true则表示至少有一个请求已经完成;返回值为false则表示请求还没有完成。不管理请求是否完成,本函数都会立即返回给调用者。 10. void get_next_response (out Request req); 本函数的作用是返回完成的下一个请求,但它不保证请求完成的顺序。 11. Object

31、resolve_initial_references (in ObjectId identifier) raises (InvalidName) 本函数的作用是根据提供的ObjectId类型的identifier,找到符合条件的、当前可用的对象,并得到该对象的引用。查找的时候,主要是看该对象的标识是否与提供的对象标识相一致。 详细说明-动态调用接口 1. 请求操作 1) void add_arg (in Identifier name, in TypeCode arg_type, in OpaqueValue value, in long len, in Flags arg_flags) 用于

32、向请求逐步添加参数。对于每个参数,至少要指定它的value和len。也可以指定它名称、类型和使用标识。如果所有的项都指定了,则服务实现方的参数验证将按照其参数集来检验所有的项。不过,有一点,请求所带参数列表中参数的顺序不一定要严格按照操作所要求的顺序。经过本函数加入到请求中的参数在调用完成或请求被删除后即被释放。 除了“公共数据结构”中定义的参数模式,arg_flags也可以取标志值:IN_COPY_VALUE。如果设置了本标志,则产生并使用参数值的一份拷贝,不过,对于输入输出和输出参数则忽略该标志。 2) void invoke (in Flags invoke_flags); 此函数调用O

33、RB,由ORB进行函数解析并调用相关函数来完成本请求。此函数的最大特点就是需要等待所请求操作被完成,返回的结果放在请求的result参数中。本函数的参数invoke_flags就是一个调用标识,没有任何确定的意义,可以参考send中的参数说明。 3) void delete ; 此函数的作用是用来删除请求。与请求相关联的所有内存。 4) void send (in Flags invoke_flags); 本函数根据请求的信息起一个操作。与invoke不同,send不需要等操作结束就把控制返回给调用者。为了判断操作何时完成,调用必须使用get_response或者get_next_respon

34、se操作。在操作完成前不得使用输出参数和返回值。其调用标志,即参数invoke_flags,被定义为CORBA:INV_NO_RESPONSE,表示调用者既不想等待响应,也不期望任何输出参数被更新。 5) void get_response raises (WrongTransaction); 本函数返回一个请求的结果。如果在请求结束之前调用本函数,它将被阻塞,直到请求完成为止。在返回时,操作结果被设置在请求中定义的输出参数2. 3. 和返回值中,如result参数。 延迟同步操作-已经在前面介绍过了 列表操作 1) void add_item (in Identifier item_name

35、, 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 ; 这个操作释放列表结构和任何相关联的内存。 3) void free_memory ;

36、这个操作释放所有动态分配的与列表相关联的输出参数内存。但不释放列表结构本身。 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_floa

37、t, 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_int

38、erface; 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 kinds boolean equal (in TypeC

39、ode tc); boolean equivalent(in TypeCode tc); TypeCode get_compact_typecode; TCKind kind ; ; ; 详细说明-可移植对象适配器 1. 2) void activate raise (AdapterInactive) 这个操作将POA管理器的状态改变为活跃。不过,并不是在POA管理器的任POA管理器接口 1) POA管理器状态转换图 何状态都可以进行这个操作的。如果当POA管理器处于终止状态时,进行这个操作就会引发异常。当POA管理器处于这个状态的时候,相关的POA就可以处理对它的请求。 3) void ho

40、ld_requests (in boolean wait_for_completion) raises (AdapterInactive) 本函数的作用是把POA管理器的状态转为保持。处于保持状态的POA不会处理对它的请求,但会把到来的请求排队,并按先后顺序处理。参数wait_for_completion的作用是用来指定本操作的返回方式的。如果该参数的值为false则本操作在改变POA管理器的状态之后立刻就返回。如果其值为true,则本操作不会立刻返回,而是要等到与此POA管理器相关的任何POA中都没有正在主动执行的请求或者POA管理器的状态被改变为保持以外的状态。 如果当POA管理器处于终止

41、状态时进行这个操作,就会引发AdapterInactive异常。 4) void discard_requests (in b9oolean wait_for_completion) raises (AdapterInactive) 这个操作将POA管理器的状态改变为丢弃状态。进入丢弃状态后,与此POA管理器相关的POA将丢弃进来的请求。此外,任何已经排队但是没有开始执行的请求都将被丢弃,正在执行的请求则将继续进行。不过,在请求被丢弃的时候,将返回一个TRANSIENT系统异常给客户。 参数wait_for_completion所表示的意义与hold_requests操作中一样。如果为fals

42、e,则这个操作在改变了状态之后立刻就返回。如果为true,就不会立刻返回,直到与这个POA管理器相关的任何POA中都没有正在主动执行的请求,或者POA管理器的状态被改变为丢弃以外的状态。 当POA管理器处于终止状态时,执行这个操作会引发AdapterInactive异常。 5) void deactivate (in Boolean etherealize_objects, in Boolean wait_for_completion) raises (AdapterInactive) 这个操作将POA管理器的状态改变为终止。进入终止状态将导致相关的POA拒绝还没有开始执行的请求,就像任何新的

43、请求一样。 改变状态后,再判断etherealize_objects参数的值。如果为true,POA管理器则使具有RETAIN策略的所有相关的POA对所有活跃对象的相关仆从管理器执行etherealize操作。如果为false,则不必调用etherealize操作。 对于wait_for_completion参数的取值与前两个一样。如果为false,则这个操作在改变了状态之后就立刻返回。如果为true,则不会立刻返回,而是等到与这个POA相关的所有POA中都没有正在主动执行的请求,并且,在etherealize_objects为true的情况下,对于所有有RETAIN策略的POA,ethere

44、alize的所有调用都已完成。 当POA管理器处于终止状态时进行这个操作的话,就会引发AdapterInactive异常。 6) 2. State get_state; 这个操作返回POA管理器的当前状态。 仆从激活器接口 1) Servant incarnate (in ObjectId oid, in POA adapter) raises (ForwardRequest) 这个操作的作用就是激活仆从,它返回的就是已经激活的仆从。Oid参数包括与进来的请求相关的ObjectId值。adapter就是被请求对象所在POA的对象引用。用户提供的仆从管理器实现负责定位或创建一个适当的仆从,该仆从

45、对应于ObjectId值。本函数返回一个Servant类型的值,也就是用来处理即将进来的请求的仆从。 2) void etherealize (in ObjectId oid, in POA adapter, in Servant serv, in Boolean cleanup_in_progress, in Boolean remaining_activations) 这个函数的作用就是终止活跃仆从。具有RETAIN策略时,每个对象的仆从被终止时,都会调用这个操作。注意,活跃仆从可以由仆从管理器通过本函数终止,即使它并不曾由这个仆从管理器实体化。 Oid参数包括终止的对象的ObjectId

46、值,adapter参数是对象所在POA的一个对象引用。Serv参数包括被终止仆从的引用。如果serv参数表示的仆从与adapter参数表示的POA中的其他对象相关,在调用etherealize时,remaining_activations参数就有true值。否则,为false值。 如果cleanup_in_progress参数是true,则调用etherealize操作的原因就是用带有true的etherealize_objects参数调用了deactivate或者destroy操作。如果为false,就是由其他原因被调用的。 通常情况下,调用本函数的原因有: a. 由于对象调用了POA:de

47、activate_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 ada

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号