现在的位置: 首页 > 综合 > 正文

Corba note

2013年11月09日 ⁄ 综合 ⁄ 共 3258字 ⁄ 字号 评论关闭

代码实例参考金山网盘:X:/usefull code/corba

CORBACommon Object Request Broker Architecture

                       CORBA体系结构

CORBA上的服务用IDL描述,IDL将被映射为某种程序设计语言如C++Java,并且分成两分,在客户方叫IDL Stub(桩), 在服务器方叫IDL Skeleton(骨架)。两者可以采用不同的语言。服务器方在Skeleton的基础上编写对象实现(Object Implementation),而客户方要访问服务器对象上的方法,则要通过客户桩。而双方又要通过而ORBObject Request Broker,对象请求代理)总线通信。


<!--[if !supportLists]-->1.1  <!--[endif]-->CORBA中的几个概念

1.2.1 ORBObject 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 AdapterPOA,可移植对象适配器)则力图解决对象实现在不同厂商的ORBs下也能使用的问题。最新的ORB产品一般都支持POA

 

2.编写第一个CORBA程序

 

1>生成IDL文件 grid.idl

2>编译idl生成stubskeleton代码

 

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]-->调用其上的操作

 

 

抱歉!评论已关闭.