第七章CORBA分布对象技术

上传人:公**** 文档编号:575253773 上传时间:2024-08-17 格式:PPT 页数:31 大小:223KB
返回 下载 相关 举报
第七章CORBA分布对象技术_第1页
第1页 / 共31页
第七章CORBA分布对象技术_第2页
第2页 / 共31页
第七章CORBA分布对象技术_第3页
第3页 / 共31页
第七章CORBA分布对象技术_第4页
第4页 / 共31页
第七章CORBA分布对象技术_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《第七章CORBA分布对象技术》由会员分享,可在线阅读,更多相关《第七章CORBA分布对象技术(31页珍藏版)》请在金锄头文库上搜索。

1、Common Object Request Broker Architecture公共对象请求代理结构公共对象请求代理结构第七章分布式对象技术第七章分布式对象技术CORBA1.1 对象管理组织对象管理组织OMG的的CORBA1.OMG(Object Management Group)成立于成立于1989年,年, OMG是个非营利性组织,是个非营利性组织,2. 不开发软件,仅仅制定标准。目前有不开发软件,仅仅制定标准。目前有900多名成员:多名成员:3. Oracle SunSoft IBM Sybase Informix HP DEC2. 1990年年11月,月,OMG发表对象管理体系指南,初

2、步阐明了发表对象管理体系指南,初步阐明了CORBA思想。思想。3. 1991年年10月,月,OMG推出推出CORBA1.0,定义了接口定义语言,定义了接口定义语言(IDL)、对象、对象 管理模型、动态请求管理模型、动态请求API和接口仓库等内容。和接口仓库等内容。4. 1991年年12月,月,OMG推出推出CORBA1.1,引入对象适配器概念。,引入对象适配器概念。5. 1996年年8月,月, OMG推出推出CORBA2.0,对象请求代理间协议,对象请求代理间协议 (IIOP Internet Inter-ORB Protocol) 完全基于面向对象技术完全基于面向对象技术6. 现在,现在,C

3、ORBA3.0 更好支持更好支持EJB和和JavaRMI 基于面向组件。基于面向组件。各种技术发展历程各种技术发展历程DNA:Windows Distributed interNet Application architecture OLE:Object Linking and Embedding,对象连接与嵌入,对象连接与嵌入什么是什么是CORBA?CORBA是由是由OMG组织制订的一种标准的组织制订的一种标准的面向对象面向对象应用程序体系结构应用程序体系结构(规范规范),为解决为解决分布式处理分布式处理环境环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案。中,硬件和软件系统的互连

4、而提出的一种解决方案。 DCE:Distributed Computing Environment1.2 CORBA用途用途CORBA是为实现软件全方位集成而设计的。是为实现软件全方位集成而设计的。分布式软件开发需解决以下五个问题:分布式软件开发需解决以下五个问题:1.跨平台(硬件)跨平台(硬件)2.跨操作系统跨操作系统3.跨语言跨语言4.跨协议跨协议5.跨版本跨版本Internet使计算机联结起来,使计算机联结起来, CORBA使应用软件联结起来。使应用软件联结起来。解决这五个问题的唯一方案,采用解决这五个问题的唯一方案,采用CORBA作为分布式软件开发人员,作为分布式软件开发人员,CORB

5、A使我们获益如下:使我们获益如下:1.混合编程混合编程 /我只会我只会C+,不会,不会Java2.丰富的编程元素丰富的编程元素 /众多基于众多基于CORBA的的Toolkits3.高效的开发手段高效的开发手段 /软件模块重用十分便利,我不需要从零开始!软件模块重用十分便利,我不需要从零开始!4.版本无关性版本无关性 /CORBA版本向上向下兼容版本向上向下兼容 CORBA将在将在Internet上实现软件的即插即用!上实现软件的即插即用!1.3 CORBA采用的技术采用的技术1.CORBA采用了面向对象技术采用了面向对象技术 / 从软件重用角度考虑问题从软件重用角度考虑问题2.CORBA采用了

6、分布式计算模型采用了分布式计算模型3.CORBA采用多层体系结构采用多层体系结构4.CORBA采用接口技术采用接口技术 / 从软件集成角度考虑问题从软件集成角度考虑问题1.4 CORBA体系结构体系结构 应用程序及应用程序及各种对象各种对象CORBA工具集工具集横向:用户界面、信息管理、系统及任务管理等工具集横向:用户界面、信息管理、系统及任务管理等工具集纵向:医疗保健、金融保险、电讯等面向行业的工具集纵向:医疗保健、金融保险、电讯等面向行业的工具集CORBA对象请求代理对象请求代理-ORBCORBA服务服务对象生存期、对象关系、命名服务、对象查询、事件服务对象生存期、对象关系、命名服务、对象

7、查询、事件服务对象属性服务、对象安全、许可服务、事务服务等对象属性服务、对象安全、许可服务、事务服务等对象级别服务对象级别服务域接口是为应用领域服务而提供的接口域接口是为应用领域服务而提供的接口 RFP(RequestForProposal)公公共共设设施施面向用户面向用户的应用的应用对象管理体系结构对象管理体系结构OMA1.4.1 对象管理体系结构对象管理体系结构OMA由由OMG制定的规范制定的规范对象管理体系结构(对象管理体系结构(Object Management Architecture, OMA)和它的核心(也就是和它的核心(也就是CORBA规范),提供了一个完整的体系结构。规范),

8、提供了一个完整的体系结构。OMA描述了面向对象技术在分布式处理中的运用。描述了面向对象技术在分布式处理中的运用。OMA包括两部分:对象模型(包括两部分:对象模型(Object Model)和)和 参考模型(参考模型(Reference Model)。)。对象模型:定义如何描述分布式异构环境中的对象。对象模型:定义如何描述分布式异构环境中的对象。参考模型:描述对象之间的交互。参考模型:描述对象之间的交互。OMA对象模型对象模型在在OMA对象模型中,对象是一个被封装的实体,它具有一个不可改变的标识,对象模型中,对象是一个被封装的实体,它具有一个不可改变的标识,并能给客户用户提供一个或多个服务。并能

9、给客户用户提供一个或多个服务。interface printerattribute long model;void print(in string buffer);OMA参考模型参考模型在在OMA参考模型中,参考模型中,OMG定义了一条为对象所公用的通信总线,即定义了一条为对象所公用的通信总线,即ORB。OMG还定义了对象进出这一总线的界面。包括:还定义了对象进出这一总线的界面。包括:n 对象服务(对象服务(Object Services)n 公共设施(公共设施(Common Facilities)n 应用界面(应用界面(Application Interface)n 域界面(域界面(Doma

10、in Interface)1.4.2 对象请求代理对象请求代理ORB联结应用程序、各种对象、联结应用程序、各种对象、CORBA服务、服务、CORBA工具集的核心。工具集的核心。ORB接口结构接口结构动态调用接口动态调用接口 DII静态调用接口静态调用接口直接调用一些直接调用一些ORB内部的功能内部的功能Portable Object AdapterCORBA允许用户以两种不同的方式提出对象请求:允许用户以两种不同的方式提出对象请求: 1. 静态调用:静态调用: 通过给定接口的存根,在编译了对象代码后,进入客户端的程序。通过给定接口的存根,在编译了对象代码后,进入客户端的程序。因此,静态调用必须

11、在编译时就知道对象及其类型。因此,静态调用必须在编译时就知道对象及其类型。2. 动态调用:动态调用:通过通过ORB的动态调用接口的动态调用接口DII,在运行时生成访问对象的代码。,在运行时生成访问对象的代码。DII:DynamicInvocationInterfaceORB的任务是:找出所要对象的位置,激活该对象,向对象传递此请求。的任务是:找出所要对象的位置,激活该对象,向对象传递此请求。 对象执行所请求的服务后,把输出值返回给对象执行所请求的服务后,把输出值返回给ORB, 然后再由然后再由ORB返回给客户。返回给客户。 ORBCLIENTSTUBSSKELETONSSERVERORBIIO

12、PMETHOD REQUESTOBJECT REFERENCESERVANTCORBA一次请求过程一次请求过程InternetInter-ORBProtocolCORBA ORB优点:优点:1. 静态和动态方法调用。静态和动态方法调用。2. 高级语言绑定。高级语言绑定。/CORBA ORB并不介意服务对象是用何种语言编写。并不介意服务对象是用何种语言编写。3. 位置透明。位置透明。/ORB能够单机模式运行,也能通过能够单机模式运行,也能通过IIOP与其它与其它ORB互连。互连。4. 内置安全和事物处理。内置安全和事物处理。5. 与遗留系统(与遗留系统(legacy system)共存。)共存。

13、/CORBA能够让对象的定义与实现分离。能够让对象的定义与实现分离。 使用使用IDL将原有的过程或函数封装。将原有的过程或函数封装。1.4.3 IDL ( Interface Definition Language )接口定义语言接口定义语言OMG IDL接口定义语言不是作为程序设计语言体现在接口定义语言不是作为程序设计语言体现在CORBA体系结构中的,体系结构中的,而是用来描述产生对象调用请求的客户对象和服务对象之间的接口的语言。而是用来描述产生对象调用请求的客户对象和服务对象之间的接口的语言。 OMG IDL文件描述了服务器提供的服务功能,客户机可以根据该接口文件文件描述了服务器提供的服务

14、功能,客户机可以根据该接口文件描述的方法向服务器提出业务请求。描述的方法向服务器提出业务请求。 在大多数在大多数CORBA产品中都提供产品中都提供IDL到相关编程语言的编译器。到相关编程语言的编译器。/就是就是ORB 如:如: Java IDL 即即idlj编译器编译器idl-to-c+ compiler OMG IDL文件文件接口仓库接口仓库OMG IDL编译器编译器客户端本地代理客户端本地代理(stub)服务器框架服务器框架(skeleton)客户机应用客户机应用服务器应用服务器应用IDL文件的应用过程文件的应用过程IDL-DefinitionClientProgramSourceObje

15、ktImplementSourceIDL-CompilerSkeletonSourceStub SourceJava/C+ CompilerClient-ProgramJava/C+ CompilerObjekt-Implement使用使用CORBA应用开发图示应用开发图示OMG IDL的语法规则的语法规则(参阅参阅IDL手册手册) 1. 模块定义模块定义 模块指定一个独立的名字空间,类似于模块指定一个独立的名字空间,类似于 C+ 的名字空间的名字空间 /Compute.idlmodule Compute typedef double radius; typedef long times; i

16、nterface PI double getResult( in radius aRadius, in times time); ; ; 2. 接口接口interface interface JobManager readonly attribute string firstName; attribute string status; string QueryJobStatus( in long number, out string property); ; 类型声明符号类型声明符号typedef与与C+一样一样IDL 模块和接口模块和接口module FruitsBasket interfa

17、ce Apple ; interface Orange ; ; 从VegetablesBasket模块中引用Apple要这样做:FruitsBasket:Apple。module FruitsBasket interface Apple ; ; module FruitsBasket interface Orange ; ; #include orange.idl module FruitsBasket interface Apple ; ; 1. 2.3.IDL范例:范例:module MeineBank exception BankFehler /异常定义异常定义 string info;

18、 /基本账户基本账户 interface BasisKonto readonly attribute long nummer; double einzahlen ( in double betrag ) raises ( BankFehler )/存钱存钱;/接口继承接口继承-支票账号支票账号interface GiroKonto : BasisKonto double attribute dispoKredit;/信贷额度信贷额度; /储蓄账号储蓄账号 interface SparKonto : BasisKonto double attribute zinssatz;/存款利率存款利率;

19、/接口多重继承接口多重继承interface GiroSparKonto : SparKonto, GiroKonto .;我的银行必须为操作中的每一个参数指明方向属性必须为操作中的每一个参数指明方向属性in :由客户机在运行时声明参数的类型并赋值,服务器只能使用不能修改其值。:由客户机在运行时声明参数的类型并赋值,服务器只能使用不能修改其值。out:由客户机在运行时声明参数的类型,服务器运行中为其赋值。:由客户机在运行时声明参数的类型,服务器运行中为其赋值。inout:由客户机在运行时声明参数的类型并赋值,服务器可以使用或修改其值。:由客户机在运行时声明参数的类型并赋值,服务器可以使用或修改

20、其值。3. 基本数据类型基本数据类型 short long unsigned short unsigned long float doublechar boolean octet any any 可以和任意的数据类型匹配,也可以在运行中被动态转换为任意数据类型。可以和任意的数据类型匹配,也可以在运行中被动态转换为任意数据类型。像像 C+中的中的Variant。4. 构造数据类型和数组构造数据类型和数组struct union enum sequence stringtypedef string aName; typedef sequence aSequence; typedef long aD

21、imension20100; enum GoodsStatus GOODS_SALED, GOODS_INSTOCK; 1.4.4 创建创建CORBA应用程序应用程序CORBA对象服务的实现方式分两种:对象服务的实现方式分两种:1. 对象的命名引用方式对象的命名引用方式/常用方式常用方式2. 字符串化对象引用方式字符串化对象引用方式创建创建CORBA应用程序的过程:应用程序的过程:1.进行系统分析,确定服务对象需要提供的功能。进行系统分析,确定服务对象需要提供的功能。2.根据分析结果,编写根据分析结果,编写IDL文件。文件。3.编译接口文件,产生服务对象的骨架与客户本地代理。编译接口文件,产生

22、服务对象的骨架与客户本地代理。4.基于服务器框架,编写服务对象实现程序。基于服务器框架,编写服务对象实现程序。5.基于客户端本地代理,编写客户对象调用程序。基于客户端本地代理,编写客户对象调用程序。6.编译客户对象和服务对象程序。编译客户对象和服务对象程序。7.启动服务对象程序。启动服务对象程序。8.启动客户对象程序。启动客户对象程序。/Hello.idlinterface Hello void say_hello();uIDL-to-C+ translatorHello.h Hello.cpp Hello_skel.h Hello_skel.cppuIDL-to-Java translato

23、rHello.java HelloHelper.java HelloHolder.java HelloOperations.java HelloPOA.java _HelloStub.javaCORBA实例实例服务对象接口定义:服务对象接口定义:通过两种不同的通过两种不同的IDL编译器:编译器:Hello-Object in C+#include “Hello_skel.h”class Hello_impl : public POA_Hello public: virtual void say_hello() throw(CORBA:SystemException);#include #inc

24、lude #include “Hello_impl.h”void Hello_impl:say_hello() throw(CORBA:SystemException) cout Hello World! endl;定义头文件定义头文件 Hello_impl.h实现头文件实现头文件 Hello_impl.cppServer-Program in C+#include #include #include int main ( int argc, char* argv ) try CORBA:ORB_var orb = CORBA:ORB_init ( argc, argv ); CORBA:Ob

25、ject_var poaObj = orb - resolve_initial_references(RootPOA); PortableServer:POA_var rootPoa = PortableServer:POA:_narrow(poaObj); PortableServer:POAManager_var manager = rootPoa - the_POAManager(); Hello_impl* helloImpl = new Hello_impl(); Hello_var hello = helloImpl - _this(); CORBA:String_var s =

26、orb - object_to_string(hello); const char* refFile = Hello.ref; ofstream out(refFile); out s activate(); orb - run(); orb - destroy(); catch ( const CORBA:Exception& e ) cerr e endl; 打开打开POA创建一个实例的创建一个实例的引用引用保存保存IORPOA 激活激活ORB 启动启动等待等待ClientsInteroperable Object Reference可互操作对象引用可互操作对象引用 Client-Prog

27、ram in Javapublic class Client public static void main ( String args ) java.util.Properties props = System.getProperties(); try org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, props); org.omg.CORBA.Object obj = null; String refFile = Hello.ref; java.io.BufferedReader in = new java.io.BufferedRe

28、ader( new java.io.FileReader(refFile); String ref = in.readLine(); obj = orb.string_to_object(ref); Hello hello = HelloHelper.narrow(obj); hello.say_hello(); orb.destroy(); catch ( Exception e ) e.printStackTrace(); 读出IOR字符串还原为对象引用采用何种语言完全取决于自己的编程爱好采用何种语言完全取决于自己的编程爱好/Hello_impl.javapublic class Hell

29、o_impl extends HelloPOA public void say_hello() System.out.println(Hello World!); 如如Hello_impl.java实现实现Hello-Object in JavaServer in C+ 使用使用Name Service方式方式#include #include #include int main ( int argc, char* argv ) try CORBA:ORB_var orb = CORBA:ORB_init ( argc, argv ); CORBA:Object_var poaObj = or

30、b - resolve_initial_references(RootPOA); PortableServer:POA_var rootPoa = PortableServer:POA:_narrow(poaObj); PortableServer:POAManager_var manager = rootPoa - the_POAManager(); Hello_impl* helloImpl = new Hello_impl(); Hello_var hello = helloImpl - _this(); CORBA:String_var s = orb - object_to_stri

31、ng(hello); const char* refFile = Hello.ref; ofstream out(refFile); out s activate(); orb - run(); orb - destroy(); catch ( const CORBA:Exception& e ) cerr e resolve_initial_references( NameService ); CosNaming:NamingContext_var nc = CosNaming:NamingContext:_narrow ( ns.in() ); CosNaming:Name aName;

32、aName.length(1); aName0.id = CORBA:string_dup(hello); aName0.kind = CORBA:string_dup(); nc - bind( aName, hello.in() ); Client in Java使用使用 Name Service方式方式public class Client public static void main ( String args ) java.util.Properties props = System.getProperties(); try org.omg.CORBA.ORB orb = org.

33、omg.CORBA.ORB.init(args, props); org.omg.CORBA.Object obj = null; String refFile = Hello.ref; java.io.BufferedReader in = new java.io.BufferedReader( new java.io.FileReader(refFile); String ref = in.readLine(); obj = orb.string_to_object(ref); Hello hello = HelloHelper.narrow(obj); hello.say_hello()

34、; orb.destroy(); catch ( Exception e ) e.printStackTrace(); org.omg.CORBA.Object ns = orb.resolve_initial_references ( NameService ); NamingContext nc = NamingContextHelper.narrow ( ns ); NameComponent aName = new NameComponent1; aName0 = new NameComponent(); aName0.id = hello; aName0.kind = ; org.omg.CORBA.Object obj = nc.resolve ( aName ); Hello hello = HelloHelper.narrow ( obj );

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号