代码实例参考金山网盘:X:/usefull code/corba
CORBA(Common Object Request Broker Architecture)
CORBA体系结构
CORBA上的服务用IDL描述,IDL将被映射为某种程序设计语言如C++或Java,并且分成两分,在客户方叫IDL Stub(桩), 在服务器方叫IDL Skeleton(骨架)。两者可以采用不同的语言。服务器方在Skeleton的基础上编写对象实现(Object Implementation),而客户方要访问服务器对象上的方法,则要通过客户桩。而双方又要通过而ORB(Object Request Broker,对象请求代理)总线通信。
<!--[if !supportLists]-->1.1 <!--[endif]-->CORBA中的几个概念
1.2.1 ORB(Object Request Broker)
CORBA体系结构的核心就是ORB。可以这样简单理解:ORB就是使得客户应用程序能调用远端对象方法的一种机制。
具体来说就是:当客户程序要调用远程对象上的方法时,首先要得到这个远程对象的引用,之后就可以像调用本地方法一样调用远程对象的方法。当发出一个调用时,实际上ORB会截取这个调用(通过客户Stub完成,“提高”篇中会详细解释),因为客户和服务器可能在不同的网络、不同的操作系统上甚至用不同的语言实现,ORB还要负责将调用的名字、参数等编码成标准的方式(称Marshaling)通过网络传输到服务器方(实际上在同一台机器上也如此),并通过将参数Unmarshaling的过程,传到正确的对象上(这整个过程叫重定向,Redirecting),服务器对象完成处理后,ORB通过同样的Marshaling/Unmarshaling方式将结果返回给客户。
因此,ORB是一种功能,它具备以下能力:
1.对象定位(根据对象引用定位对象的实现)
2.对象定位后,确信Server能接受请求
3.将客户方请求通过Marshaling/Unmarshing方式重定向到服务器对象上
4.如果需要,将结果以同样的方式返回。
1.2.2 IDL(Interface Definition Language)
如果说ORB使CORBA做到平台无关,那么IDL, 则使CORBA做到语言无关。
IDL仅仅定义接口,而不定义实现,类似于C中的头文件。实际上它不是真正的编程语言。要用它编写应用,需要将它映射它相应的程序设计语言上去,如映射到C++或JAVA上去。映射后的代码叫Client Stub Code和 Server Skeleton Code。
1.2.3 Stub Code 和 Skeleton Code
Stub code 和Skeleton Code 是由IDL Complier自动生成的,前者放在客户方,后者放在服务器方。不同厂商的IDL complier生成的Stub 和Skeleton会略有区别,但影响不大。
如上面的grid.idl, 编译后,Stub Code包含以下文件:
grid.java
_gridStub.java
gridHelper.java
gridHolder.java
gridOperations.java
Skeleton Code则包含以下文件:
gridOperations.java
gridPOA.java
gridPOATie.java
(在Stud Code 也包含gridOperations.java, 是因为在使用Call back机制时会用到。)
1.2.6 Object Adapter (对象适配器)
对象适配器是ORB的一部分。它主要完成对象引用的生成、维护,对象定位等功能。对象适配器有各种各样。Basic Object Adapter(BOA, 基本对象适配器)实现了对象适配器的一些核心功能。而Portable Object Adapter(POA,可移植对象适配器)则力图解决对象实现在不同厂商的ORBs下也能使用的问题。最新的ORB产品一般都支持POA
2.编写第一个CORBA程序
1>生成IDL文件 grid.idl
2>编译idl生成stub和skeleton代码
Stub Code包含以下文件:
1.grid.java 定义了接口 interface grid
2._gridStub.java 桩代码,定义了class _gridStub
class _gridStub中实现了客户方的set()和get()等方法,它们封装了ORB的功能,截取客户的调用,执行Marshaling/Unmarshing等操作,最终得到调用结果。也就是说,在客户方声明一个grid类型的对象,实际上使用gridHelper操作得到的是一个_gridStub类型的实例,调用grid上的方法实际上是调用_gridStub上的方法。
3.gridHelper.java
帮助客户方grid对象生成一个_gridStub类型的实例,同时得到服务器对象的引用。
4.gridHolder.java
当需要处理out,inout类型的参数时,需要这个类
5.gridOperations.java
这个接口实际上是Server使用的。当客户方需要使用callback功能时,也需要这个接口。
Skeleton Code则包含以下文件:
1.gridPOA.java
定义类abstract public class gridPOA
extends org.omg.PortableServer.Servant
implements org.omg.CORBA.portable.InvokeHandler, gridOperations
{
}
Server方的Implementation代码直接继承自这个类。
2.gridPOATie.java
当使用代理方式而不是继承方式创建Server Object时,使用这个类。
3>编写Server方的Implementation代码(即编写Servant)
Server方的实现对象称为Servant, 编写Implementation代码实际上就是对IDL定义的每个interface,都编写一个Servant,其中要现实interface中定义的每个方法。.
这里我们将Servant类定义为class gridImpl,类名字可以自己随便取,通常都命名为xxxImpl的形式。Class gridImpl直接继承自gridPOA。
public class gridImpl extends gridPOA{}
4>编写Server
Server的主要任务就是创建所需的Servant,同时通知POA已准备就绪,可以接受客户方的请求。
通常,一个Server主程序执行以下几个步骤:
<!--[if !supportLists]-->1) <!--[endif]-->初始化ORB;
<!--[if !supportLists]-->2) <!--[endif]-->创建Servant对象;
<!--[if !supportLists]-->3) <!--[endif]-->激活POA管理器;
<!--[if !supportLists]-->4) <!--[endif]-->通知ORB准备接受请求。
Orbix 2000提供了两种获取对象引用的方式,一种叫file based,即读取文件的方式;一种叫Naming Service,即通常所说的命名服务。
5>编写Client
通常,客户程序需要执行以下步骤:
<!--[if !supportLists]-->1) <!--[endif]-->初始化ORB;
<!--[if !supportLists]-->2) <!--[endif]-->获得Servant对象的引用;
<!--[if !supportLists]-->3) <!--[endif]-->调用其上的操作