CORBA基本介绍
CORBA(Common Object Request Broker Architecture ,公用对象请求代理体系)是OMG(对象管理组织)于1991年提出的基于对象技术的分布计算应用软件体系结构。与过去的面向过程的RPC(Remote Procedure Call)不同,CORBA是基于面向对象技术的,它能解决远程对象之间的互操作问题。CORBA标准主要分为三个部分:接口定义语言(IDL)、对象请求代理(ORB),以及ORB之间的互操作协议IIOP,核心是对象请求代理。CORBA可以抽象系统平台、网络通讯及编程语言的差异。通过在CORBA技术规范中定义多种类型的服务,如名字服务(Naming Service)、事务服务(Transaction Service)、对象生命期服务(LifeCycle Service)、并发控制服务(Concurrency Control Service)、时间服务(Time Service)等功能,为应用软件开发者提供一个全面、健壮、可扩展的分布对象计算平台,使面向对象的应用软件在分布异构环境下方便地实现可重用、易移植和互操作。
与RMI比较
与RMI 不同,CORBA 不属于Java 平台本身。OMG(Object Management Group,对象管理组织)发明了CORBA 规范,CORBA 被设计成与平台和语言无关。因此,CORBA对象可以运行于任何平台之上,位于网络的任何位置,还可以用任何语言(包括 Java、C、C++和Smalltalk 等)编写,只要该语言具有IDL(Interface Definition Language,接口定义语言)的映射。
与RMI 相比,CORBA 是为更大、可伸缩更强的系统准备的,在这些系统中可能有数千个对象;CORBA 的编程和部署比RMI 更复杂,但允程序员开发需要事务、安全性等支持的企业级系统;CORBA 的命名服务也比RMI 命名注册功能更强大和灵活。
CORBA 的实现称为ORB(Object Request Broker,对象请求代理)。Java IDL 即是CORBA 的一个实现,它是JDK1.3 或更高版本的核心软件包之一,定义在org.omg.CORBA及其子包中。在Java IDL 的支持下,开发人员可以使用如下两种方法将Java 和CORBA 集成在一起:
·创建Java 对象并使之可在CORBA ORB 中展开,
·创建Java 类并作为和其它ORB 一起展开的CORBA 对象的客户。这种方法提供了另外一种途径,通过它Java 可以被用于将你的新的应用和以前遗留的系统相集。
利用Java创建CORBA应用
CORBA对象服务的实现方式分为两种:1)对象的命名引用方式 2)字符串化对象引用方式。不论采用何种高级语言,创建CORBA应用程序的过程大体如下:
● 编写IDL接口定义文件;
● 将接口定义文件编译为相应高级语言源代码,产生服务器框架与客户端存根;
● 基于服务器框架,编写服务对象实现程序;
● 基于客户端存根,编写客户对象调用程序;
● 分别编译客户对象和服务对象程序;
● 运行服务对象和客户对象程序;
java IDL 创建CORBA应用实例分析
下面通过一个实例,描述如何通过Java创建CORBA应用程序。
1) 编写IDL 接口定义文件(Hello.idl) ,关于IDL 定义的语法请查看“IDL 定义语法”
module HelloApp {
interface Hello {
string sayHello(in string message);
};
};
2) 将接口定义文件IDL 文件编译为相应的高级语言的源代码,产生服务器框架和客户端存根
SUN 通过将IDL 编译为java代码的工具idlj,产生服务框架和客户端存根,具体操作如下:
idlj -fall Hello.idl
3)接口实现HelloImpl.java
HelloImpl.java是Hello IDL 接口的实现;每个Hello实例都由一个HelloImpl实例来实现。HelloImpl是HelloPOA的子类,HelloPOA是由idlj编译器从示例 IDL 中生成的。
import org.omg.CORBA.*; import HelloApp.HelloPOA; public class HelloImpl extends HelloPOA { private ORB orb; public void setORB(ORB orb_val) { orb = orb_val; } /* 实现接口声明方法sayHello */ public String sayHello(String message) { System.out.println("我在CORBA的服务器端,客户端正在调用'sayHello'方法。"); System.out.println("Hello " + message); return message; } }
import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CORBA.*; import org.omg.PortableServer.*; import org.omg.PortableServer.POA; public class HelloServer { public static void main(String args[]) { try { /* 创建和初始化 ORB */ ORB orb = ORB.init(args, null); /* 获取对RootPOA的引用,启动POAManager */ POA rootpoa = POAHelper.narrow(orb .resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); /* 创建一个实例并将其向 ORB 注册 */ HelloImpl h = new HelloImpl(); h.setORB(orb); System.out.println("将实例注册到ORB "); /* 获取对服务端的对象引用 */ org.omg.CORBA.Object ref = rootpoa.servant_to_reference(h); Hello href = HelloHelper.narrow(ref); /* 从名称服务中获取根元素名称上下文 */ org.omg.CORBA.Object objRef = orb .resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); /* 在Hello名称下注册新对象 */ String name = "Hello"; NameComponent path[] = ncRef.to_name(name); ncRef.rebind(path, href); /* 等待客户端的调用。 */ orb.run(); System.out.println("等待CORBA客户端调用..."); } catch (Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } System.out.println("HelloServer Exiting ..."); } }
import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CORBA.*; public class HelloClient { public static void main(String args[]) { try { /* 创建和初始化 ORB */ ORB orb = ORB.init(args, null); /* 获取根命名上下文 */ org.omg.CORBA.Object objRef = orb .resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); /* 在名称上下文中查找Hello对象,获取对它的引用。 */ String name = "Hello"; Hello h = HelloHelper.narrow(ncRef.resolve_str(name)); System.out.println("我在客户端,开始调用CORBA服务器端的'sayHello'方法"); System.out.println("欢迎, " + h.sayHello("javamxj blog")); } catch (Exception e) { System.out.println("错误 : " + e); e.printStackTrace(System.out); } } }