西安电子科技大学软件学院CORBA应用程序开发过程西安电子科技大学软件学院Agenda设计CORBA应用程序CORBA应用程序开发过程一个例子——银行账户管理西安电子科技大学软件学院Agenda设计CORBA应用程序CORBA应用程序开发过程一个例子——银行账户管理西安电子科技大学软件学院CORBA与OO技术虽然CORBA支持非面向对象的程序设计语言,但建议使用OO语言实现:–IDL是OO风格的。–非OO语言的实现不能直接在CORBA系统中使用,需要进行OO形式的包装。–在分析设计阶段可以利用OO的方法和工具。西安电子科技大学软件学院设计CORBA应用程序设计基于CORBA的分布式系统时,一般应考虑如下几个问题:–网络传输–消息传递–运行平台–资源优化–其它西安电子科技大学软件学院设计CORBA应用程序网络传输–多样化的网络传输选择•不同的编程模式–AppleTalk、DCERPC、RMI、GIOP/IIOP•不同的底层通信协议–TCP/IP、DCEnet、NovellIPX/SPX、SNA、X.25•不同的通信介质–以太网、串口线•连接持续性因素–固定网络计算、可移动计算。–设计CORBA应用时,应确保ORB能使用必要的网络传输。西安电子科技大学软件学院设计CORBA应用程序消息传递–CORBA提供了三种消息传递方式:•同步方式•异步方式(延迟同步方式)•单向方式–应根据不同的应用场合选择使用:•所申请的服务只需很短的时间即可完成,应选用同步方式•所申请的服务需要较长时间才可完成,应选用异步方式•如果客户程序无需获知请求已完成的确认信息,应选用单向方式。西安电子科技大学软件学院设计CORBA应用程序运行平台–由于不同平台(硬件/OS)之间的差异,为一个平台创建的软件系统通常不能运行在另一个平台之上。•运行于不同平台(硬件/OS)之上的CORBA对象之间(或者客户端与CORBA对象之间)可以跨这些平台通信。–设计者必须在软件系统的性能与通用性之间作出折衷选择。西安电子科技大学软件学院设计CORBA应用程序资源优化–分布式环境下,跨网络的通信开销是相当可观的,占用相当多的系统资源:•网络资源、接口、通信信道、逻辑链路等。–设计系统时应考虑尽量提高这些资源的利用率,避免频繁的跨网络(尤其是广域网)通信。其它决策–安全性、可靠性、事务处理、并发控制等。–考虑更多的错误处理:•例如客户程序发出请求但服务程序未就绪,甚至找不到服务程序或无权限访问服务程序。西安电子科技大学软件学院Agenda设计CORBA应用程序CORBA应用程序开发过程一个例子——银行账户管理西安电子科技大学软件学院典型的CORBA应用表示层中间层数据层数据库CORBA对象CORBA客户端典型的CORBA应用西安电子科技大学软件学院CORBA应用开发过程CORBA规范并没有限制ORB的具体实现方法,所以不同厂商对ORB的具体实现方法可能差别很大,这就导致不同厂商提供的ORB上操作可能有很大的差异。但基本过程都是类似的。利用OO方法进行分析设计标识应用程序所需的对象实现每个对象,部署,运行西安电子科技大学软件学院典型的CORBA应用实现过程用IDL编写对象规格说明编译IDL生成桩和框架编写客户程序代码编写对象实现和服务程序代码编译客户程序编译服务程序运行客户程序运行服务程序启动对象请求代理(ORB)内核一个典型CORBA应用的实现过程西安电子科技大学软件学院编写对象接口对象接口是关于服务对象语法的规格说明。接口定义中包括:–提供或使用的服务的名字–参数–返回值–异常–上下文环境等对象接口由OMGIDL定义西安电子科技大学软件学院编译IDL文件IDL编译器IDL文件StubSkeleton输入输出输出厂商实现IDL编译器时应参照OMG制订的语言的规范,编程人员只要选择使用合适的编译器就可以了。VisiBrokerforJava4.0提供的idl2java编译器将IDL映射到Java语言,生成Java语言的客户端桩代码以及服务端框架代码。西安电子科技大学软件学院编写客户程序初始化ORB绑定到服务对象调用服务对象提供的服务客户程序操作流程西安电子科技大学软件学院初始化ORB无论是客户程序还是服务程序,都必须在利用ORB进行通信之前初始化ORB。初始化ORB的作用–让ORB了解有新的成员加入。–获取ORB伪对象的引用,以备将来调用ORB内核提供的操作。•所谓伪对象专指在CORBA基础设施中的一个对象–伪对象是本地的。–利用伪对象调用CORBA基础设施提供的服务。–用一种统一的观点看待所有对象。–伪对象也使用IDL定义。西安电子科技大学软件学院ORB服务ORB内核提供了一些不依赖于任何对象适配器的操作:–初始化ORB–获取初始引用的操作–动态调用相关的操作–生成类型码的操作–线程和策略相关的操作西安电子科技大学软件学院编写对象实现和服务程序代码编写对象实现:–IDL文件只定义了服务对象的规格说明,程序员必须另外编写服务对象的具体实现。–对象实现则有很多选择的余地:•Java、C++、C、Smalltalk•对象实现所用的语言与客户程序所选用的语言无关,只要ORB产品供应商支持IDL到这些语言的映射即可。–程序员应该熟悉IDL到所选择的语言的映射规则,因为:•IDL编译器除了生成Stub和Skeleton外,还会自动生成一些对象实现需要用到的辅助代码。–VisiBroker的idl2java会生成一些对象适配器的Java类和各种辅助性的Java类,编写对象实现的代码时必须继承其中的一些类或使用某些类提供的方法。西安电子科技大学软件学院编写对象实现和服务程序代码编写对象实现后,还必须实现服务程序的main例程。–服务程序利用可移植对象适配器(POA)激活伺服对象供客户程序使用。–服务程序通常是一个循环执行的进程,不断监听客户程序请求并为之服务。西安电子科技大学软件学院创建并部署应用程序一些ORB产品提供了专门的编译器以简化这一过程:–VisiBrokerforJava提供的编译器vbjc会自动调用JDK中的Java编译器javac,指示javac在编译客户程序的同时编译相关的客户程序桩文件,在编译服务程序的同时编译相关的服务程序框架文件。客户程序代码IDL生成的Stub客户端应用程序编译服务端代码IDL生成的Skeleton服务端应用程序编译创建客户端应用程序创建服务端应用程序西安电子科技大学软件学院创建并部署应用程序部署应用程序–在部署阶段由系统管理员规划如何在终端用户的桌面系统安装客户程序,或在服务器一类的机器上安装服务程序。–部署工作由单独的角色来承担•EJB中部署人员还有更多的工作要做。西安电子科技大学软件学院运行应用程序运行CORBA应用程序时,必须首先启动服务程序,然后才可运行客户程序。–VisiBrokerforJava要求其ORB内核(osagent)必须在客户程序启动之前启动完成。西安电子科技大学软件学院Agenda设计CORBA应用程序CORBA应用程序开发过程一个例子——银行账户管理西安电子科技大学软件学院例子背景银行账户管理–服务端管理大量银行顾客的账户,提供基本的开户、存款、取款、查询余额的功能。西安电子科技大学软件学院对象认定一个银行帐户的实体模型。balance:表示当前的余额。deposit:存款withdraw:取款getBalance:查询余额manage银行中的储蓄员的实体模型。accountList:记录当前已开设的所有帐户。open:根据帐户标识查找某一帐户,如果该标识的帐户不存在则创建一个新帐户。西安电子科技大学软件学院定义对象接口//银行帐户管理系统的对象接口定义moduleBank{//帐户interfaceAccount{//存款voiddeposit(infloatamount);//取款booleanwithdraw(infloatamount);//查询余额floatgetBalance();};//帐户管理员interfaceAccountManager{//查询指定名字的帐户,查无则新开帐户Accountopen(instringname);};};Bank.idl西安电子科技大学软件学院生成Stub与Skeletonpromptidl2javaBank.idlidl2javaBank.idlStubSkeleton输入输出其它辅助文件西安电子科技大学软件学院生成Stub与SkeletonVisiBrokerforJava的IDL编译器idl2java为每个接口自动生成7个文件:–AccountOperations.java–Account.java–_AccountStub.java–AccountPOA.java–AccountPOATie.java–AccountHelper.java–AccountHolder.java西安电子科技大学软件学院生成的接口定义Account.java和AccountOperations.java定义了IDL接口Account的完整基调。–AccountOperations.java定义了Account接口中定义的所有常量和方法。packageBank;publicinterfaceAccountOperations{publicvoiddeposit(floatamount);publicbooleanwithdraw(floatamount);publicfloatgetBalance();}西安电子科技大学软件学院生成的接口定义–Account.java是真正使用接口定义,因为VisiBroker规定所有的接口必须从两个预定义的接口派生而来(类似COM中的IUnknown接口)。packageBank;publicinterfaceAccountextendscom.inprise.vbroker.CORBA.Object,Bank.AccountOperations,org.omg.CORBA.portable.IDLEntity{}西安电子科技大学软件学院生成的接口定义packageBank;publicinterfaceAccountextendscom.inprise.vbroker.CORBA.Object,org.omg.CORBA.portable.IDLEntity{publicvoiddeposit(floatamount);publicbooleanwithdraw(floatamount);publicfloatgetBalance();}用一个文件来代替AccountOperations.java和Account.java西安电子科技大学软件学院生成的Stub_AccountStub.java是Account对象在客户端的桩代码,它实现了Account接口。–程序员编写的客户程序代码通常不直接调用这个类中的方法。–VisiBrokerforJava生成了另外的辅助类AccountHelper。•该类提供了一个narrow方法,用于返回一个Account接口的指针。实际上该方法实例化了一个_AccountStub对象,所以客户端通过返回的接口指针实际调用了桩对象的代码,由桩对象完成具体的和服务端的通信。西安电子科技大学软件学院生成的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[]_