CORBA通用对象代理体系结构(Common Object Request Broker Architecture)CORBA是目标管理组织定义的解决方案,用于实现大量硬件和软件之间的相互操作。CORBA也是面向目标标准化和相互操作的重要一步。
■CORBA技术简介
简单地说,CORBA允许应用程序相互通信,无论它们存在于哪里,谁设计它们。CORBA1.OMG于1991年发布,定义了界面定义语言(IDL)并向对象请求代理(ORB)实现客户对象与服务器对象之间交互的应用编程界面(API)。CORBA2.0于1994年发布,规定了各供应商之间的ORB通信规则。
CORBA标准主要分为三部分:界面语言定义(IDL)、对象请求代理(ORB)以及ORB之间的互操作协议IIOP。
ORB是对象之间建立Client/Server关系的中间件。使用ORB,客户可以透明地在本地或通过网络连接的其他机器上调用服务对象的方法。ORB拦截此调用,同时负责查找实现服务的对象,并将参数和调用方法返回到最终结果中。客户不知道服务对象在哪里,它的编程语言和操作系统是什么,也不知道不属于对象接口的其他系统部分。这样,ORB为不同机器在异构分布环境中的应用提供了可操作性,并无缝集成了各种对象系统。
在开发传统的Client/Server应用程序时,开发人员使用自己设计的或公认的标准来定义设备之间通信的协议。该协议的定义取决于实现语言、网络传输和许多其他因素,而ORB的出现简化了这一过程。使用ORB时,协议使用界面定义语言(IDL)定义,IDL是独立于语言的。此外,ORB提供了很强的灵活性,使程序员能够选择最合适的操作系统、执行环境,甚至使用不同的编程语言来实现系统的每个组件。更重要的是,它允许现有组件集成。在基于ORB的解决方案中,开发人员可以使用与创建新对象相同的IDL来建模遗留系统,并在标准化软件总线和遗留系统接口之间创建“包装”代码以传输信息。
使用CORBA,用户可以透明地访问信息,不需要知道软件中存在什么信息,使用什么硬件平台,位于企业网络中。CORBA作为面向对象系统的通信核心,为当今的计算环境带来了真正的互操作性。
■CORBA与JAVA的关系
CORBA不仅意味着对象要求代理(ORB),它也是一个非常全面的分布式对象平台。CORBA使JAVA应用程序能够跨越网络、语言和操作系统,并为JAVA提供分布式自我观察、动态发现、事务、关系、安全和命名等分布式服务。
JAVA不仅是一种语言,也是一种动态代码系统,是运行对象的可移植虚拟机(JVM)。JAVA为Client/Server应用程序的开发、管理和发布提供了更简单的方法。在不关心其安装和升级的情况下,人们可以将该应用程序放在Web服务器上,将该应用程序发布给数千名用户。JAVA也非常适合服务器的开发,它可以动态地将服务代码转移到最需要它们的地方。
JAVA将使CORBA对象能够在各种可编程机器上运行,如主机、网络计算机和蜂窝电话,并简化大型CORBA系统的代码发布。JAVA是客户和服务对象的理想编程语言。JAVA内置的多线程、垃圾收集和错误处理使编写强大的网络对象更容易。 这两种对象模型可以很好地相互补充。CORBA为JAVA移植应用环境提供了分布式结构,CORBA处理网络的透明度和JAVA处理的透明度。
■使用JAVA开发CORBA应用
让我简要介绍一下开发CORBA的步骤。
开发CORBA应用JAVA需要以下五个步骤:
1.使用IDL创建接口 (About.idl) 下面的OMG IDL描述CORBA对象。 module About { interface Show { string ShowName(); }; }; 将其存储为Show.idl。
2.编译接口并生成CORBA支持文件 我们用下面的命令来编译这个 IDL 接口: idltojava Show.idl idltojava是SUN公司的IDL编译器,可从SUN公司网站免费下载。 在编译IDL文件之前,idltojava需要预编译,如果您的机器上没有预编译器,可以使用以下命令: idltojava -fno-cpp Show.idl 编译后,About子目录将在当前目录下生成,包括一些支持文件。如果你感兴趣,你可以看看,但不能修改。
3.实现服务器 (ShowServer.java)
ShowServermain() 该方法可以完成以下任务:
(1)创建一个 ORB 实例
(2)为服务对象创建实例(CORBA About 对象的实现)并通知 ORB
(3)获得上下文命名的CORBA对象引用,在命名上下文中注册新的CORBA对象
(4)在命名上下文中注册新对象“About”名下
(5)等待调用新对象
实现服务器源程序如下: import About.; import org.omg.CosNaming.; import org.omg.CosNaming.NamingContextPackage.; import org.omg.CORBA.; class ShowObject extends _ShowImplBase { public String ShowName() { return "\nMy name is Seymour!!\n"; } } public class ShowServer { public static void main(String args[]) { try{ // 创造和初始化 ORB ORB orb = ORB.init(args, null); // 创建服务对象并将其转向 ORB 注册 ShowObject ShowRef = new ShowObject(); orb.connect(ShowRef); // 上下文获取根命名 org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); // 引用绑定命名中的对象 NameComponent nc = new NameComponent("About", ""); NameComponent path[] = {nc}; ncRef.rebind(path, ShowRef); // 等待客户机的调用 java.lang.Object sync = new java.lang.Object(); synchronized (sync) { sync.wait(); } } catch (Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } } }
4.实现客户机 (ShowClient.java)
客户机将完成以下任务:
(1)创建ORB;
(2)获得指向命名上下文的引用;
(3)在命名上下文中查找“Show并获得指向 CORBA 引用对象;
(4)调用对象 ShowName() 操作和打印结果。 import About.; import org.omg.CosNaming.; import org.omg.CORBA.; public class ShowClient { public static void main(String args[]) { try{ // 创造和初始化 ORB ORB orb = ORB.init(args, null); // 上下文获取根命名 org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); ////引用分析命名中的对象 NameComponent nc = new NameComponent("About", ""); NameComponent path[] = {nc}; About.Show ShowRef = ShowHelper.narrow(ncRef.resolve(path)); // 调用 Show 服务对象并打印结果 String show = ShowRef.ShowName(); System.out.println(show); } catch (Exception e) { System.out.println("ERROR : " + e) ; e.printStackTrace(System.out); } } }
5.构建和运行ShowName程序
(1)编译 .java 文件,包括 stub 和 skeleton(在About目录中): javac .java About/.java
(2)启动MS-DOS命令解释器,输入以下命令,确保名称服务器运行: tnameserv -ORBInitialPort 1050
(3)启动另一个MS-DOS命令解释器,输入以下命令,启动Show服务器: java ShowServer -ORBInitialPort 1050
(4)启动MS-Dos命令解释器Show应用程序客户机: java ShowClient -ORBInitialPort 1050 此时屏幕上会出现“此时屏幕上会出现”My name is Seymour!这个词表明实验已经成功了。这个词表明实验已经成功了。