670 likes | 1.05k Views
JAVA IDL And CORBA. 目的和要求. 本次课的安排是介绍 CORBA 及如何使用 JAVA 编写 CORBA 客户和服务。到本次课结束时大家应该能够使用 JAVA 设计和实现利用 CORBA 通信的系统. CORBA. Common Object Request Broker Architecture 公用对象请求代理程序体系结构. 概述.
E N D
目的和要求 本次课的安排是介绍CORBA 及如何使用JAVA编写CORBA客户和服务。到本次课结束时大家应该能够使用JAVA设计和实现利用CORBA通信的系统
CORBA Common Object Request Broker Architecture 公用对象请求代理程序体系结构
概述 CORBA是一个分布式的面向对象应用架构规范, 它 定 义 了 分 布 式 对 象 如 何 实 现 互 操 作,它是由OMG研究组在80年代末提出,在90年代逐步完善,形成现在被软件行业普遍认可的标准——CORBA/IIOP 规范2.3。CORBA的开发者OMG最初由3Com、American Airlines、Canon、Data General、Hewlett-Packard、Philips、 Sun 和Unisys等八家公司在1989年组建,专门从事公共软件平台的研究和行业标准的制订, 目前已经有800多个成员单位加入OMG。
CORBA的核心是对象请求代理——ORB (Object Request Broker),它提供了网络环境无关性、操作系统无关性和开发语言无关性的公共平台。在面向对象的应用环境中,CORBA对象的请求者不必知道它所请求的对象是在哪里,是如何实现的,而是由ORB来负责跨平台的运作管理,无须应用系统的开发者干预。CORBA所具有的跨平台、分布式、面向对象的这些优点使它具有广阔的应用前景,日益受到软件行业的重视。CORBA是一个中间件规范并不是一个实体软件。软件开发者通过使用第三方的ORB工具或IDL语言来定义CORBA对象,实现ORB功能。
CORBA的产生 • CORBA的产生有其特定的背景,它是在面向对象的技术兴起,客户/服务器模式普遍得到应用的前提下,为屏蔽通信和实现细节的需求,继承已有系统,消除“孤岛”现象而产生的。 • 最 初,OMG 在1990 年 制 订 了 对 象 管 理 体 系(Object Management Architecture), 即OMA, 来 描 述 应 用 程 序 如 何 实 现 互 操 作。 作 为 其 中 的 一 部 分, 需 要 有 一 个 标 准 规 范 应 用 程 序 片 段 即 对 象 的 互 操 作 ─ ─ 这 导 致 了CORBA 的 诞 生。
CORBA与IDL • 为 了 保 持CORBA 的 商 业 中 立 性 和 语 言 中 立 性, 必 须 有 一 个 中 介, 存 在 于 象C + +CORBA 服 务 器 代 码 和Java CORBA 客 户 机 这 样 的 实 体 之 间。 这 就 是IDL。虽然CORBA本身不是一门语言,但是它引入了一门新的语言。CORBA服务由模式(schema)来描述,而模式是对象可用方法的模版。这样的模式由IDL(Interface Definiyion Language,接口定义语言)表示。和java一样支持CORBA的语言可以实现IDL模式,从而让其他软件可以调用方法。IDL语言是中立的 ,因此可以利用任何已经作了IDL映射的程序设计语言。
可以映射的语言 • 目前,可以从OMG得到下列IDL语言的映射规范: • C • C++ • Smalltalk • COBOL • Ada • Java
CORBA对象的客户有一个对该对象的“对象引用”,客户使用“对象引用”来请求“对象方法”。如果服务端不在本地(不在同一机器的同一应用系统中或不在同一机器中),则“对象引用”指向stub功能(在Java 中,stub和skeleton都是类来实现),stub利用ORB机制将请求带到服务端的对象。stub通过ORB来确定运行对象的服务端的机器,并请求该机器的ORB连接到对象的服务端去。stub同ORB建立连接后,向该机的skeleton发送“对象引用”及相关参数,再由skeleton功能连接到目标对象的“对象实现”上。skeleton将请求和参数转换成规定格式然后调用该对象。最后,“对象实现”的结果沿着来的路径传送回客户请求端。
在这个操作过程中,客户并不知道CORBA对象的位置、它的实现细节,也不必知道所使用的ORB是什么。在ORB之间通过建立在TCP/IP标准之上的IIOP-Internet InterORB Protocol进行通信联系,相互传送信息。客户只是使用CORBA对象的接口来调用对象的方法,CORBA对象的接口则使用IDL语言来定义。对象的接口定义了对象的类型,对象的方法和引用参数以及对象方法可能返回的异常结果。IDL编译器将把CORBA对象的定义转换成特定的编程语言。IDL还对每个对象生成相应的stub文件(类)和skeleton文件(类),通过它们实现应用系统同ORB的连接。
几个需要了解的概念 • ORB, • OA,BOA • POA • GIOP, IIOP, • IOR • 动态调用接(DII),接口公用库
ORB • ORB(Object Request Broker)对象请求代理:它作为一个“软件总线”来连接网络上的不同对象,提供对象的定位和方法调用,它是CORBA实现的关键。 在后面会详细讨论 ORB。
OA, BOA • OA(Object Adapter)对象适配器:用于构造对象实现与ORB之间的接口。它给框架发送方法,调用并且支持服务器对象的生命周期(如:对象的创建和删除)。 BOA(Basic Object Adapter)基本对象适配器:负责激活对象,即当客户请求对象的服务时,激活对象实现的能力。
POA • POA(Portable Object Adapter)可移植对象适配器:是BOA的替代方式,提供大量可扩展的接口,来处理一些对于BOA来说不合理的要求。特性: (1)支持透明激活对象。 (2)允许单个服务者支持很多对象标识。 (3)允许一个服务者上有多个POA,每个都有自己的一套管理策略。 (4)将对不存在服务者的请求委托给默认服务者,或者向服务者的管理器请求一个合适的服务者。
GIOP, IIOP, IOR • GIOP(General Inter-ORB Protocol)通用ORB之间的协议:定义了一个不同ORB之间的接口。 IIOP(Internet Inter-ORB Protocol)因特网ORB之间的协议:IIOP把GIOP消息数据映射为TCP/IP连接行为和输入/输出流读/写。 注意:IIOP不是完全从GIOP分离出来的协议,它更像是GIOP的一个实例。 IOR(Interoperable Object Reference)可操作对象引用:它包括所有客户与服务器联系所需的各种信息(包括CORBA服务器对象进程的IP地址和TCP端口等),ORB将通过它产生在网络上唯一标识那个将被分布对象的消息。
接口公用库,动态调用接口 • 接口公用库 接口公用库持久地存储IDL的接口说明,借助于接口公用库,可以实现对象继承性层次结构的导航,并且提供了有关对象支持的所有操作的描述。接口公用库最常见的功能是为接口浏览器提供信息,帮助应用开发者找出潜在的可重用的软件部件。ORB可以利用接口公用库检查运行时的操作参数类型,但接口公用库的基本功能是提供类型信息,为动态调用接口发送请求提供信息支持。 • 动态调用接口 把IDL说明编译成面向对象程序设计语言的实代码后,客户可以调用已知对象的操作。在某些应用中,用户并不了解应用接口编译信息,但也要求调用对象的操作,这时就要动态调用接口来调用用户的操作了。例如,图形用户接口应支持用户浏览接口公共库,以获得每个对象所支持的操作信息,用户可根据自己的需求从浏览对象中挑选出所需的对象操作,具体的对象操作的调用实际上是用动态调用接口来完成的。
CORBA服务 • 在CORBA体系结构中,软件服务由模式描述,而由服务者实现。服务者是特殊的软件,它向某个查找服务(lookup service)注册自己,因此其他的CORBA软件可以定位并访问它的服务。通常,CORBA服务器将创建CORBA服务者,然后负责为服务者创建ORB对象并注册服务,以让 其他客户访问。下图显示了进行中的这个过程:
Server A 注册服务者 CORBA NameService Server B 注册服务者 用名称服务进行客户注册
CORBA客户 客户端不需要向名称服务器注册。它们使用名称服务器来查找其他服务。过程如下图: Serever A 注册服务者 CORBA NameService IIOP 查找服务 Client 远程引用
Object Request Broker 详 述 • OMA 定 义 了 组 成CORBA 的 四 个 主 要 部 分: • 对象请求代理ORB(Object Request Broker)。 • 对象服务(Object Services) • 公共设施(Common Facilitites) • Business Objects
对象请求代理ORB(Object Request Broker) • (1) 对象请求代理ORB(Object Request Broker):负责对象在分布环境中透明地收发请求和响应,它是构建分布对象应用、在异构或同构环境下实现应用间互操作的基础。ORB是一个中间件,他在对象间建立客户-服务器的关系。通过ORB,一个客户可以很简单地使用服务器对象的方法而不论服务器是在同一机器上还是通过一个网络访问。ORB截获调用然后负责找到一个对象实现这个请求,传递参数和方法,最后返回结果。客户不用知道对象在哪里,是什么语言实现的,他的操作系统以及其他和对象接口无关的东西。
对象服务(Object Services) • (2) 对象服务(Object Services):为使用和实现对象而提供的基本对象集合,这些服务应独立于应用领域。主要的CORBA服务有:名录服务(Naming Service)、事件服务(Event Service)、生命周期服务(Life Cycle Service)、关系服务(Relationship Service)、事务服务(Transaction Service)等。这些服务几乎包括分布系统和面向对象系统的各个方面,每个组成部分都非常复杂。
公共设施(Common Facilitites) • (3) 公共设施(Common Facilitites):向终端用户提供一组共享服务接口,例如系统管理、组合文档和电子邮件等。
Business Objects • Business Objects 定 义 现 实 世 界 的 对 象 和 应 用, 如 飞 机 或 银 行 帐 户。
ORB • OMA 最 重 要 的 部 分 就 是ORB。 为 了 创 建 一 个 遵 从CORBA 规 范 的 应 用 程 序,ORB 是CORBA 四 大 部 分 中 唯 一 必 须 提 供 的。 许 多ORB 版 本 根 本 不 CORBA Services 或 是CORBA Facilities, 你可以自制( 或 购买) 商 用 对 象。 但 是, 没 有ORB,CORBA 应用 程 序 决 对 无 法 工 作。 CORBA ORB 最显见 的 功 能, 是 对 你 的 应 用 程 序 或 是 其 它ORB 的 请 求 予 以 响 应。 在CORBA 应 用 程 序 运 行 期 间, 你 的ORB 可 能 被 请 求 做 许 多 不 同 的 事 情, 包 括:
ORB的功能 • (1)查 找 并 调 用 远 程 计 算 机 上 的 对 象 • (2)负 责 不 同 编 程 语 言 之 间 的 参 数 转 换( 如C + + 到Java) • (3)可 超 越 本 机 界 限 的 安 全 管 理 • (4)为 其 它 的ORB 收 集 并 发 布 本 地 对 象 的metadata (元数据) • (5)用 下 载 的 代 码(stub) 中 描 述 的 静 态 方 法 调 用 去 激活 远 程 对 象 中 的 方 法 • (6)用 动 态 方 法 调 用激活远 程 对 象 • (7)自 动激活一 个 当 前 没 有 装 入 内 存 运 行 的 对 象。
ORB的功能 • (8)将 回 调 方 法 导 引 向 其 管 理 之 下 的 本 地 对 象 • (9)实 现 细 节 对 软 件 开 发 者 的 透 明 性, 是ORB 的 一 个 杰 出 的 特 性。 用 户 只 须 在 代 码 中 提 供 相 应 的hooks, 用 于 初 始 化ORB 并 向ORB 登 记 该 应 用 程 序, 就 可 以 将 该 应 用 程 序 和 大 量 分 布 式 对 象 建 立 联 系。
CORBA中两种不同的调用方式 • CORBA允许用户以两种不同的方式提出对象请求:1)静态调用: 通过给定接口的存根,在编译了对象代码后,进入客户端的程序。因此,静态调用必须在编译时就知道对象及其类型。2)动态调用: 通过ORB的动态调用接口DII,在运行时生成访问对象的代码。 不管客户以哪一种形式提出请求,ORB的任务是:找出所要对象的位置,激活该对象,向对象传递此请求。对象执行所请求的服务后,把输出值返回给ORB,然后再由ORB返回给客户。
IDL • IDL (Interface Definition Language) • 概述语言 • IDL数据类型 • IDL接口 • IDL模块 • IDL属性 • IDL操作 • IDL异常处理
IDL概述语言 • 使 用 接 口 描 述 语 言(Interface Description Language) 编 写 的 对 象 接 口, 使 得 与 语 言 无 关 的 独 立 性 成 为 可 能。IDL 使 得 所 有CORBA 对 象 以 一 种 方 式 被 描 述, 仅 仅 需 要 一 个 由 本 地 语 言(C/C++、Java) 到IDL 的“ 桥 梁”。CORBA 对 象 的 互 通 信 要 以 对 象 请 求 解 析 器(Object Request Broker) 为 中 介, 这 种 互 通 可 以 在 多 种 流 行 通 信 协 议 之 上( 如TCP/IP ) 实 现。 在TCP/IP 上, 来 自 于 不 同 开 发 商 的ORB 用Internet Inter-Orb 协 议(IIOP) 进 行 通 讯, 这 是CORBA 2.0 标 准( 最 新 的 版 本) 的 一 部 分。
如何定义一个数组 interface Product { string getDescription(); }; typedef sequence<Product> ProductSeq interface Warehouse { ProductSeq find(in string s); } 在java语言中,序列对应于各个数组。例如,find方法可以被映射为: Product[ ] find( String c)
IDL接口 • 接口定义描述远程对象以及该对象表现出的方法和成员变量,如常量.接口由关键字interface描述。下面是一个接口的示例: interface UserAccount { float getBalance(); void setBalance(in float amount); };
IDL接口需要注意的几个地方 1)CORBA支持接口的继承,例如: Interface Book :Product{ /*… */}; 可以用冒号(:)表示继承性,一个接口可以继承多个接口的属性。 2)不能在CORBA接口中设定变量,对象的数据表示方法是实现方法的组成部分,而IDL根本没有解决它的实现方法的问题。
IDL模块 • 模块(module)是为了方便把逻辑上相关接口组合在一起的一种便捷方式。模块与java中的包相似,相关的类被归为一个类别。 Module AccountTypes { interface UserAccount{…}; interface UserID{…}; interface SubScription{…} }
IDL属性 • 例子: interface UserAccount { attribute float balance; readonly attribute long long accountid; };
IDL属性转化为java表示 interface Book { attribute string isbn; } Java编程语言中的等价接口是一对方法,两个方法都带有isbn: String isbn()//accessor Void isbn(String _isbn)//mutator 如果该属性声明为readonly ,那么将不生成任何变换器方法。
IDL操作 • IDL操作是模式定义中最重要的部分。可以远程调用这些擦操作,执行你所能想到的简单的或者复杂的任务。 • 操作是可以在结束时返回值并接受参数的函数。
IDL操作的参数 • 可以为IDL操作指定三种参数: • in 只能用于输入的参数,是非可变的。 • out 值为可修改的参数,不是非可变的. • inout 组合了in 和out属性的参数,这样的参数既可以被用作输入,又可以被修改.
IDL操作的例子 interface UserBalance { float getBalance() ; float addBalnace(in float amount); float subtractBalnace(in float amount); }; 如果方法不具有返回值,可以使用void关键字指名这种情况。
IDL操作需要注意的地方 • IDL不支持重载的方法,你必须为每一个方法配备一个不同的名字。
IDL异常处理 module BankingSystem { exception AccountInactive { String reason; }; exception AccountOverdrawn { string reason; }; interface BankAccount { double withdrawMoney(in double amout) raises (AccountInactive , AccountOverdrawn ); }; };
IDL异常处理需要注意的几个地方 • 1 )在CORBA中,异常不可以为子类。 • 2 )可以在一个模式中定义几个异常,并可以在一个操作中抛出多种异常。 • 3 ) raises 关键字被用来表示抛出异常的方法。
从IDL到JAVA • 一个示例模式 • 把IDL模式已映射到JAVA • 编写服务者代码 • 编写客户代码 • 开始工作!
一个示例模式 module calc { interface calculator { long add(in long x, in long y);}; };保存的名为: calculator .idl的文本文件。
把IDL模式已映射到JAVA • Java JDK 1.2以上提供了对CORBA的支持,Java IDL即idlj编译器就是一个ORB,可用来在Java语言中定义、实现和访问CORBA对象。Java IDL支持的是一个瞬间的CORBA对象,即在对象服务器处理过程中有效。实际上,Java IDL的ORB是一个类库而已,并不是一个完整的平台软件,但它对Java IDL应用系统和其他CORBA应用系统之间提供了很好的底层通信支持,实现了OMG定义的ORB基本功能。
如何转换? 1)指定生成文件的路径 idlj [–td c:\_work\corbasem] calculator.idl 2)生成客户端的类 idlj -fclient calculator.idl (default) 3)生成服务器端的类 idlj -fserver calculator.idl 4)生成客户端和服务器端的类 • idlj -fall calculator.idl 5)生成老版本的类文件(jdk1.4以前) • idlj -oldImplBase calculator.idl
calculator.java [server,client] • calculatorOperations.java [server,client] • calculatorHelper.java [client] • calculatorHold.java [client] • calculatorPOA.java [server] • _calculatorStub.java [client]