首页 > 编程语言 >使用 CORBA 和 Java IDL

使用 CORBA 和 Java IDL

时间:2023-07-24 23:07:46浏览次数:59  
标签:CORBA Java 对象 客户机 IDL 服务器



使用 CORBA 和 Java IDL


 


关于 CORBA

CORBA(Common Object Request Broker Architecture,公用对象请求代理体系结构)是 Object Management Group (OMG) 协会开发的标准分布式对象体系结构。自 1989 年以来,OMG 的任务就是为开放式软件总线或对象请求代理(Object Request Broker,ORB)提供体系结构规范。以此为基础,不同厂商编写的对象组件可跨过网络和操作系统实现互操作。该标准允许 CORBA 对象相互调用,而无需知道所访问对象的位置或实现被请求对象所用的语言。OMG 指定的接口定义语言(Interface Definition Language,IDL)用于为 CORBA 对象定义接口。

CORBA 对象与典型编程语言对象的不同之处在于:

  • CORBA 对象可在网络上任何位置定位。
  • CORBA 对象可与其它平台上的对象实现互操作。
  • CORBA 对象可用任何编程语言编写,只要存在从 OMG IDL 到该语言的映射(当前指定的映射包括 Java、C++、C、Smalltalk、COBOL 及 Ada)。


关于 Java IDL

Java IDL 是同 JDK 1.2 一起提供的对象请求代理。它可与 idltojava 编译器(可从 Java Developer Connection 下载)一起用于定义、实现和访问用 Java 编程语言编写的 CORBA 对象。Java IDL 符合 CORBA/IIOP 2.0 规范 (orbos/97-02-25) 和 IDL-to-Java 语言映射(orbos/98-01-06 终版)标准。

Java IDL ORB 支持瞬态 CORBA 对象 - 该对象的生命期受服务器进程生命期的限制。Java IDL 也提供瞬态名字服务器,以便将对象组织为树型目录结构。名字服务器符合在 CORBAservices:通用对象服务规范中所述的命名服务规范标准。瞬态对象及名字服务器将在下文中讨论。

接口库并不是作为 Java IDL 的组成部分来提供的。由于一般情况下客户机可访问已生成的 stub 文件,因此不需要接口库。

Nutshell 中的 CORBA 概念

本节引入的概念在 CORBA/IIOP 2.0 规范中有更全面的论述。

下图展示从客户机传送到服务器 CORBA 对象实现的方法请求。客户机是调用 CORBA 对象上某方法的任意代码(其本身也可能是 CORBA 对象)。servant 是对象实现的实例 - 实现该 CORBA 对象的实际代码和数据。

使用 CORBA 和 Java IDL_java

CORBA 对象的客户机具有对该对象的对象引用,并用该对象引用来发出方法请求。如果该服务器对象是远程对象,则对象引用将指向 stub 函数,该函数则使用 ORB 机制向服务器对象传送调用。stub 代码使用 ORB 来标识运行该服务器对象的计算机,并且向该计算机的 ORB 请求与该对象服务器连接。stub 代码取得该连接时,会将对象引用和参数发送到链接目标对象实现的 skeleton 代码。skeleton 代码将该调用和参数变换为所需的、与实现有关的格式,然后调用该对象。任何结果或异常都会沿同一路径返回。

客户机不知 CORBA 对象的位置、实现详情及用来访问该对象的 ORB。不同的 ORB 通过由 OMG 指定的 Internet InterORB 协议 (IIOP) 通讯。[CORBA/IIOP 2.0:ch 9,10]

客户机只能调用在 CORBA 对象接口中指定的方法。CORBA 对象接口通过 OMG 接口定义语言 (IDL) [CORBA/IIOP 2.0 ch3] 进行定义。接口定义对象类型,同时指定一组已命名的方法和参数及这些方法可能返回的异常类型。IDL 编译器(如 idltojava )可依照相应的 OMG 语言映射将 CORBA 对象定义翻译为指定的编程语言。因此,idltojava 编译器将依照 IDL-Java 语言映射将 IDL 定义翻译为 Java 结构。

idltojava 编译器为每个对象类型都生成 stub 和 skeleton 文件。stub 文件为客户机提供用客户机编程语言表示的对 IDL 定义的方法的访问。服务器 skeleton 文件将对象实现粘合到 ORB 运行时,ORB 使用 skeleton 将方法分配给对象实现实例 (servants)。

定义并实现 CORBA 对象

开发 CORBA 对象的目的是创建并注册对象服务器或普通服务器。服务器是一个程序,其中包含一个或多个对象类型的实现并注册到 ORB。例如,用户可以开发一个桌面排版服务器,实现“Document”对象类型、“Paragraph”对象类型及其它相关的对象类型。

CORBA 对象接口

所有 CORBA 对象都支持定义对象类型的 IDL 接口。一个接口可继承一个或多个其它接口。IDL 语法与 Java 或 C++ 非常相似,CORBA 的 IDL 文件在功能方面与语言无关,类似于 C++ 头文件。将 IDL 映射到每个编程语言后,即可提供从该语言到对象接口的访问。有了 Java IDL,这些 IDL 接口可用 idltojava 编译器翻译为 Java。对于每个 IDL 接口,idltojava 都生成 Java 接口以及其它所需的 .java

IDL 接口声明一组客户机可访问的操作、异常及有类型的属性(值)。每个操作都有一个说明定义操作的名称、参数、结果及异常。以下为描述经典“Hello World”程序的简单 IDL 接口。


module HelloApp { interface Hello { string sayHello(); }; };


当出现错误条件时,操作会抛出异常。异常的类型表明了所遇到的错误种类。除正常结果外,客户机还必须准备处理每个操作的已定义异常和 CORBA 标准异常。

基于 Java 语言的实现

一旦定义了 IDL 接口,且 idltojava 编译器基于 .idl 文件运行,就可编写包含方法实现的 .java 文件。而后,.java 实现文件即可被编译并链接到 idltojava 生成的 .java 文件和 ORB 库,以便创建对象服务器。

对象实现将为它所支持的接口的所有操作和属性定义行为。一个接口可能有多个实现(例如每个实现都用来强调特定的时间和空间权衡)。实现定义创建/破坏接口和对象的行为。

由于只有服务器能创建新的 CORBA 对象,因此应为每种对象类型定义并实现工厂对象接口。例如,如果一种对象类型为 Document,则带有 create 方法的 DocumentFactory 对象类型将作为服务器的一部分来定义和实现(注意,“create”不是保留的,可以用任何方法名)。而后,create 方法的实现可用 new 来创建对象。例如:


DocumentServant document  = new DocumentServant():
orb.connect(document);


可在 Document 上定义并实现 destroy 方法,或者该对象可无限延续(注意,“destroy”不是保留的,因此可使用任何名称)。

Java IDL ORB 只支持瞬态对象,其生命期受服务器进程生命期的限制。虽然当服务器进程终止运行时瞬态对象也会消失,但该对象的实现可以来将其状态保存到文件中,并在创建时从该文件重新初始化。

客户机实现

客户机代码与 idltojava 生成的 .java 文件和 ORB 库链接。在 Hello World 实例中提供了应用程序和applet客户机的示例。

客户机只可使用服务器提供的已公布工厂接口来创建 CORBA 对象。同样,只有该对象公布一个破坏方法,客户机才能删除 CORBA 对象。由于一个 CORBA 对象可能为网络上的很多客户机所共享,因此,只有对象服务器才能够知道该对象何时成为垃圾。

客户机代码在 CORBA 对象上发送方法请求的唯一方式是经由该对象的对象引用。对象引用是不透明结构,它标识 CORBA 对象的主机、主机服务器监听请求的端口及在进程中指定对象的指针。因为 Java IDL 只支持瞬态对象,所以在服务器进程终止并重启时该对象引用将无效。

客户机一般以如下方式获得对象引用:

  • 从工厂对象获得。例如,为创建新的 Document,客户机可调用 DocumentFactory 对象上的 create 方法。DocumentFactory create 方法将 Document 的对象引用返回到客户机。
  • 从 nameservice 获得。例如,通过在 nameservice 上发送请求,客户机可获得 DocumentFactory 的对象引用。
  • 从专门创建自对象引用的字符串获得。

一旦获得对象引用,客户机必须将它限定为适当类型。IDL 支持继承,其继承的根目录为 IDL 中的 Object,即 Java 中的 org.omg.CORBA.Objectorg.omg.CORBA.Object 自然是 java.lang.Object 的子类)。某些操作(特别是名称查询和解串)返回使用 idltojava 编译器生成的帮助类可将其限定为所期望的派生类 org.omg.CORBA.Object。由于 Java 运行时无法总是知道 CORBA 对象的确切类型,因此必须显式地限定 CORBA 对象类型。


Java IDL 瞬态名字服务器

Java IDL Transient Nameservice 是同 Java IDL 一起提供的对象服务器。在命令行提示中使用 tnameserv 可以启动此名字服务器。本对象服务器符合在本页中先前部分所述的标准对象实现及调用技术。

名字服务器通过与文件目录相似的树型结构按名称存储对象引用。客户机可通过名称查找或解析对象引用。因为名字服务器是一种普通的 Java IDL 瞬态服务器,所以每次 tnameserv 终止运行时,整个名称目录结构都会丢失。

有关详细信息,参见命名服务

 

标签:CORBA,Java,对象,客户机,IDL,服务器
From: https://blog.51cto.com/u_16174476/6840085

相关文章

  • java.util.concurrent 编程范例
    java.util.concurrent范例之一java.util.concurrent之一Java代码packagetest;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassTestThreadPool{ publicstaticvoidmain(Stringargs[])thr......
  • Java Proxy
    packagecom.su.liuqing.proxy_;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;publicclassProxyTest{//目标接口publicinterfaceTarInterface{voidsay();}//调用处理器publicstaticcla......
  • Java中的super关键字
    Java中super是一个关键字,和this的比较类似。1、特点: (1)super指向的是当前对象的父类型,而this指向的是当前对象; (2)虽然在大部分情况下super可以省略,但如果需要使用父类的方法或者属性,则必须使用super;1publicclassPerson{23publicPerson(){4......
  • Java-Day-35( 类加载 + 细化解释各阶段 )
    Java-Day-35类加载基本说明反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载静态加载:编译时加载相关的类,如果没有则报错,依赖性太强在非具备idea辅助型的工具里编写代码时importjava.util.Scanner;publicclasstest{publicstaticvoidmain(......
  • Java-Day-36( 通过反射获取类的结构信息 + 通过反射访问类中的成员 + 章节练习 )
    Java-Day-36通过反射获取类的结构信息第一组:java.lang.Class类以下说的包含本类和父类——也包括超类等方法属性之类的若是输出时不加.getName,则都是输出:com.zyz.Zyz()publicclasstest{publicstaticvoidmain(String[]args){}@Testpubl......
  • 老杜 JavaWeb 讲解(十四) ——JSP+Servlet改造oa项目
    (十四)JSP改造oa项目相关视频:38-Servlet和JSP改造oa项目使用Servlet+JSP完成oa项目的改造使用Servlet处理业务,收集数据。使用JSP展示数据。将之前原型中的html文件,全部修改为jsp,然后在jsp文件头部添加page指令(指定contentType防止中文乱码),将所有的JSP直接拷贝到web......
  • 价值年薪70W的JAVA进阶学习路线!终于让我从阿里P8手里抠出来了
    作为一个男人我感觉必须得做点什么来证明一下自己,现在我又回来了,准备把自己的节操准备补一下。另外给各位未来的Java程序员说一句,别的我不清楚,学习编程请从一而终咱们学习编程就挺难的,有这些先驱者来带领咱们学习,咱们应该感激,而且最重要的事跟着你选定的一家一直学下去因为每家学校......
  • 用Java集合中的Collections.sort方法对list排序的两种方法
    用Collections.sort方法对list排序有两种方法第一种是list中的对象实现Comparable接口,如下:   <strong>/**02 *根据order对User排序03 */04 publicclassUserimplementsComparable{05 privateStringname;06 privateIntegerorder;07 publicStringgetN......
  • tokyotyrant-java客户端
    目录:概述演示[一]、概述java实现了对ttserver服务端的连接和访问。相关的源代码和jar包可以到其官网下载。官网地址:http://code.google.com/p/tokyotyrant-java/如果是maven构建项目的,在pom.xml的<dependencies>节点中增加如下依赖配置即可:1 <dependency>2<groupId>......
  • 为什么有一些什么方法都没有的接口会存在?比如java.lang.Cloneable
    /***Aclassimplementsthe<code>Cloneable</code>interfaceto*indicatetothe{@linkjava.lang.Object#clone()}methodthatit*islegalforthatmethodtomakea*field-for-fieldcopyofinstancesofthatclass.*<p>*Invo......