CORBA,ACE学习指南

        先介绍两个网站:
        1。Douglas C.Schmidt的大本营:http://www.cs.wustl.edu/~schmidt/;
        2。ACE/TAO的下载地址:http://deuce.doc.wustl.edu/Download.html。

        由于现在的软件应用都趋向于分布式,分布式软件集成需要有良好的接口,并遵循行业标准,所以我们需要先学习分布式软件标准CORBA(Common Object Request Broker Architecture)。TAO(The ACE ORB)就是ACE在CORBA领域应用的杰作。
        CORBA整体上是由ORB(Object Request Broker)、CORBA服务、CORBA工具集以及CORBA应用(对象)构成。
        ORB是连接CORBA服务、CORBA工具集、CORBA应用的核心,使得对象可以透明地发送请求和接受响应。
         CORBA服务为基于CORBA的分布式软件开发提供了“对象”级别的服务,包括名字、生存周期服务、事务服务、安全服务等。
         CORBA工具集为基于CORBA的分布式软件开发提供了“应用”级别的服务。例如信息管理、系统管理、任务管理和用户界面等。
         CORBA应用即符合CORBA标准的各种应用程序和对象。
        下面介绍CORBA中的几个核心概念:
         1.对象、伺服对象以及对象适配器(Object Adapter):
         CORBA对象为具有标识、接口和实现的抽象实体。CORBA对象是抽象的—它和用来实现它的机制并没有直接的结合。从客户机的角度来看,对象表示为对象引用,对象引用封装了对象接口类型和标识,并
包含足够的信息来定位对象的实现。
        伺服对象(Servant)是 CORBA对象在服务器端的具体实现,使抽象的C O R B A对象能和实现该对象功能的具体编程语言实体彻底分离。这样从服务器的角度来看, CORBA对象表现为伺服对象。要记住CORBA是与编程语言独立的体系结构。伺服对象可实现为C++或Java类,也可以实现为一系列的COBOL段或 C函数。伺服对象的概念也有助于反映这种与编程语言的独立性。
         对象适配器是一CORBA组件,负责把CORBA的对象概念适配为编程语言的伺服对象概念(Schmidt and Vinoski)。对象适配器用来处理应用程序和ORB如何交互来管理伺服对象和CORBA对象生命周期的问题。BOA(Basic Object Adapter)和POA(Portable Object Adapter)是CORBA体系结构演变过程中两个重要的里程碑。BOA着重CORBA服务器实现,而不是CORBA对象实现。前面所说的伺服对象是在 POA规范中引入的,有了伺服对象,POA主要负责把CORBA的对象概念适配为编程语言的伺服对象概念,从而允许编程人员构造在不同ORB产品上可以移 植的对象实现。

         2.CORBA接口定义语言IDL:
         IDL是CORBA体系中的另一个重要概念。如果说ORB使CORBA做到平台无关,那么IDL, 则使CORBA做到语言无关。
         IDL仅仅定义接口,而不定义实现,类似于C中的头文件。实际上它不是真正的编程语言。要用它编写应用,需要将它映射它相应的程序设计语言上去,如映射到 C++或JAVA上去。映射后的代码叫Client Stub Code和 Server Skeleton Code。

        3.ORB之间的通信协议GIOP/IIOP:
       为了支持ORB之间的互操作,CORBA规约定义了ORB间通信的标准协议GIOP(General Inter ORB Protocal)。GIOP主要由三部分组成:公共数据表示(CDR)、GIOP消息格式和GIOP消息传递。
        GIOP因为是一种通用协议,所以不能直接使用。在不同的网络上需要有不同的实现。目前使用最广的便是Internet上的GIOP,称为IIOP(Internet Inter-ORB Protocol),IIOP基于TCP/IP协议。

         了解了以上概念,我们就可以采用一种编程语言来实现一个小小的CORBA程序。编写CORBA程序首先要定义IDL,然后选择一种IDL编译器将IDL编 译成 Client Stub 代码和 Server Skeleton代码。使用Java语言的朋友可以直接使用JDK(1.4以上)编译,使用C++的朋友可以使用C++Builder编译,但是我们使用 ACE,当然要选择TAO了。用TAO编译完IDL以后,就可以分别编写Server方和Client方的实现代码了。