第三章中间件简单Corba程序设计.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

山东大学计算机科学与技术学院基础技术教学部第三章简单Corba程序设计山东大学计算机科学与技术学院1CORBA应用开发过程CORBA规范并没有限制ORB的具体实现方法,所以不同厂商对ORB的具体实现方法可能差别很大,这就导致不同厂商提供的ORB上操作可能有很大的差异。但基本过程都是类似的。山东大学计算机科学与技术学院1.1开发环境InpriseVisiBroker4.5+JDK1.3+UltraEditJacORB3.6+JDK1.6+Ant1.7+[Eclipse]山东大学计算机科学与技术学院1.2静态工作方式客户方对象实现方IDL桩(客户方代理)IDL构架(服务方代理)ORB内核山东大学计算机科学与技术学院设计一个静态方式的程序IDL文件对象实现IDL编译器JavaC++…IDL桩JavaC++…IDL构架JavaC++…客户方调用服务方主程序山东大学计算机科学与技术学院1.4典型的CORBA应用实现过程用IDL编写对象规格说明编译IDL生成桩和框架编写客户程序代码编写对象实现和服务程序代码编译客户程序编译服务程序运行客户程序运行服务程序启动对象请求代理(ORB)内核一个典型CORBA应用的实现过程山东大学计算机科学与技术学院对象接口对象接口实际上是分布式对象向外提供服务的规格说明是客户程序与对象实现之间的一种合约,双方必须严格遵守对象接口定义中的约定,包括操作名字,参数表,返回表,异常表,上下文等对象接口定义存放在一个或多个IDL文本文件中,指明每一对象对外提供的服务,以及客户程序如何使用这些服务或处理服务的返回结果山东大学计算机科学与技术学院1.3IDL语言说明性语言,定义组件接口,不定义实现。语法上可以看成C++的一个子集,规定组件的属性、所继承的父类、产生的异常、事件和各类数据类型。编译器作用:将IDL映射到具体程序设计语言,产生桩代码和框架代码调用请求经客户端桩传递给ORB,然后转发到服务端框架,最后到达真正要执行请求的对象实现实例山东大学计算机科学与技术学院编写对象实现和服务程序IDL文件只定义了对象的语法规格说明,必须编写这些对象的具体实现代码对象实现可用各种语言实现,且与客户程序的语言无关IDL到编程语言的映射规则–生成IDL框架代码和各种辅助性的java接口或类–编写对象实现代码时必须继承或使用其中的某些接口或类服务程序–利用POA激活伺服对象供客户对象使用–通常是一个循环执行的进程,不断监听客户程序请求并为之服务山东大学计算机科学与技术学院编写客户程序初始化ORB–是应用程序进入CORBA的起点–作用让ORB了解有新的成员加入获取ORB伪对象的引用,以备调用ORB内核提供的操作时使用–伪对象(pseudoobject):在CORBA基础设施中的一个对象获取分布式对象引用,利用其调用对象实现提供的服务山东大学计算机科学与技术学院创建并部署应用程序客户端:客户程序代码与IDL编译器自动生成的IDL桩代码一起编译服务端:对象实现代码与服务程序代码与IDL框架代码一起编译山东大学计算机科学与技术学院1.5例子背景银行账户管理–服务端管理大量银行顾客的账户,提供基本的开户、存款、取款、查询余额的功能。山东大学计算机科学与技术学院1.5.1对象认定一个银行帐户的实体模型。balance:表示当前的余额。deposit:存款withdraw:取款getBalance:查询余额manage银行中的储蓄员的实体模型。accountList:记录当前已开设的所有帐户。open:根据帐户标识查找某一帐户,如果该标识的帐户不存在则创建一个新帐户。山东大学计算机科学与技术学院1.5.2定义对象接口//银行帐户管理系统的对象接口定义moduleBank{//帐户interfaceAccount{//存款voiddeposit(infloatamount);//取款booleanwithdraw(infloatamount);//查询余额floatgetBalance();};//帐户管理员interfaceAccountManager{//查询指定名字的帐户,查无则新开帐户Accountopen(instringname);};};Bank.idl山东大学计算机科学与技术学院1.5.3生成Stub与SkeletonIDL编译器作用是将IDL映射到具体程序设计语言,产生桩代码和框架代码Visibrokerforjava提供的编译器idl2java将IDL映射到java语言,生成java语言的桩和框架语言每个对象实例都有一个用于唯一标识自身的对象引用。客户程序利用对象引用指明调用的方向表面上看,客户程序调用的是远程对象实现上的操作,实际被调用的代码是作为其代理的IDL桩山东大学计算机科学与技术学院生成Stub与Skeletonpromptidl2javaBank.idlidl2javaBank.idlStubSkeleton输入输出其它辅助文件山东大学计算机科学与技术学院1.5.4生成7个文件VisiBrokerforJava的IDL编译器idl2java为每个接口自动生成7个文件:–AccountOperations.java–Account.java–_AccountStub.java–AccountPOA.java–AccountPOATie.java–AccountHelper.java–AccountHolder.java山东大学计算机科学与技术学院1.5.4.1生成的接口定义Account.java和AccountOperations.java定义了IDL接口Account的完整基调。–AccountOperations.java(操作基调)定义了Account接口中定义的所有常量和方法。packageBank;publicinterfaceAccountOperations//操作接口{publicvoiddeposit(floatamount);publicbooleanwithdraw(floatamount);publicfloatgetBalance();}山东大学计算机科学与技术学院生成的接口定义–客户程序代码中,程序员通常使用的是操作接口的派生接口Account(位于Account.java)packageBank;publicinterfaceAccountextendscom.inprise.vbroker.CORBA.Object,Bank.AccountOperations,org.omg.CORBA.portable.IDLEntity{}山东大学计算机科学与技术学院1.5.4.2生成的Stub_AccountStub.java是Account对象在客户端的桩代码,它实现了Account接口。–程序员编写的客户程序代码通常不直接调用这个类中的方法。–VisiBrokerforJava生成了另外的辅助类AccountHelper。山东大学计算机科学与技术学院生成的StubpackageBank;publicclass_AccountStubextendscom.inprise.vbroker.CORBA.portable.ObjectImplimplementsAccount{finalpublicstaticjava.lang.Class_opsClass=Bank.AccountOperations.class;privatestaticjava.lang.String[]__ids={IDL:Bank/Account:1.0};publicjava.lang.String[]_ids(){return__ids;}publicvoiddeposit(floatamount){//与ORB交互,完成真正的deposit方法调用}publicbooleanwithdraw(floatamount){//与ORB交互,完成真正的withdraw方法调用}publicfloatgetBalance(){//与ORB交互,完成真正的getBalance方法调用}}_AccountStub.java山东大学计算机科学与技术学院1.5.4.3生成的SkeletonAccountPOA.java是Account对象的服务端框架代码,该类的功能:–解包in类型的参数并将参数传递给对象实现。–打包返回值与所有out类型的参数。打包(marshal):指将特定程序设计语言描述的数据类型转换为CORBA的IIOP流格式。解包(unmarshal):从IIOP流格式转换为依赖于具体程序设计语言的数据结构。编写对象实现的最简单途径是继承这些POA类,即把它们作为对象实现的基类。山东大学计算机科学与技术学院生成的SkeletonpackageBank;publicabstractclassAccountPOAextendsorg.omg.PortableServer.Servantimplementsorg.omg.CORBA.portable.InvokeHandler,Bank.AccountOperations{publicstaticorg.omg.CORBA.portable.OutputStream_invoke(...){org.omg.CORBA.portable.OutputStream_output=null;{switch(_method_id){case0:{floatamount;amount=_input.read_float();_self.deposit(amount);_output=_handler.createReply();return_output;}case1:{//...}case2:{//...}}}}}AccountPOA.java山东大学计算机科学与技术学院1.5.4.4生成的辅助工具类IDL编译器为每一个用户自定义类型还生成一个辅助工具类。AccountHelper.java声明了AccountHelper类,该类为Account接口定义了许多实用功能和支持功能的静态方法(又称类方法)。–从Any对象提取或向Any对象插入对象(extract和insert方法);–从输入/输出流读写对象(read和write方法);–获取对象的库标识和类型码(id和type方法);–绑定对象与类型转换操作(bind和narrow方法)等等。编程时会用到该类中提供的方法。山东大学计算机科学与技术学院生成的辅助工具类packageBank;publicfinalclassAccountHelper{publicstaticBank.Accountnarrow(finalorg.omg.CORBA.Objectobj){//...}publicstaticBank.Accountbind(org.omg.CORBA.ORBorb,java.lang.Stringname){//...}//...}AccountHelper.java山东大学计算机科学与技术学院1.5.4.5生成的对象传递支撑类AccountHolder.java声明的AccountHolder类为传递对象提供支持。–IDL有三种参数传递方式:in、out和inout。–in类型的参数以及返回结果与Java的参数传递方式与结果返回方式完全相同。–out和inout两种类型的参数允许参数具有返回结果的能力,无法直接映射到Java语言的参数传递机制,这时AccountHolder类为传递out和inout参数提供了一个托架(holder)。山东大学计算机科学与技术学院In表明实际参数从客户程序传向对象实现Out表明数据从实现对象传递给客户程序,并且对象实现无需从客户程序获取参数的初始值Inout表明数据从客户程序传给对象实现,然后经对象实现加工后再返回给客户程序山东大学计算机科学与技术学院生成的对象传递支撑类packag

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功