【已阅】CORBA Programming with TAO - 8.Event Service
CORBA和Tao的语法规则
CORBA和Tao的语法规则1)注意,在IDL当中定义的数据类型和C++当中的数据类型有一个映射关系,它并不会直接使用在IDL当中所定义的类型。
2)简单的基本类型TAO支持的IDL数据类型及其C++ Mapping关系,TAO支持以下简单基本数据类型(%TAO_ROOT%/tao/Basic_Types.h):以上各简单基本类型对应的C++类型只是对应平台上基本类型的typedef。
为了保证程序的可移植性,应该总是使用CORBA命名空间中的类型标识。
没有我们熟悉的C++基本类型byte(被Octet取代)、int(被Long取代)。
3)复杂的基本类型(Tao说支持的数据类型)4)应该总是使用TAO提供的(也是CORBA规范规定的)如下字符串操作函数:char * string_alloc(ULong len);char * string_dup(const char *);void string_free(char *);WChar * wstring_alloc(ULong len);WChar * wstring_dup(const WChar *);void wstring_free(WChar *);(w)string_alloc/(w)string_dup后必须调用(w)string_free来释放分配的资源,为了避免忘记(w)string_free带来的麻烦,有些情况下,我们可以考虑使用String_var类型。
String_var 是String类对应的智能指针类,除了TAO本身支持的智能指针类型外,tao_idl在生成代码时会自动为每个Object添加一个对应的var类型)。
5)具体的字符串函数的使用:●(w)string_alloc(n)会分配n+1个字符(不是字节)空间举例:#include<tao/corba.h>#include<iostream>using namespace std;int main() {char * p = CORBA::string_alloc(5); // Allocates 6 bytesstrcpy(p, "Hello"); // OK, "Hello" fitscout << p << endl;CORBA::string_free(p);CORBA::String_var s = CORBA::string_dup("World");cout << s.in() << endl;return 0;}●CORBA::Any可以在其中存入任意其他类型的数据,我们可以通过<=操作符来向Any类型变量写入信息,而通过>=操作符从Any变量中读出信息,由于重载的>=操作符返回的是一个表示转换成功或者失败的标志,我们总是使用if...else来对解析结果进行判断。
CORBA规范综述
CORBA规范综述张亚红宋凯华东计算技术研究所二OOO年三月目录引言 (3)第一章CORBA 体系结构 (3)第1.01节CORBA规范概述 (3)第1.02节对象管理架构(OMA) (4)第1.03节CORBA详细结构图 (5)第二章对象服务(CORBAServices)的具体内容 (7)第2.01节名字服务 (7)第2.02节生存周期服务 (8)第2.03节事件服务 (10)第2.04节交易黄页服务 (12)第2.05节事务服务 (13)第2.06节并发控制服务 (15)第2.07节安全服务 (15)第2.08节持久性服务 (16)第2.09节流转换服务 (18)第2.10节查询服务 (19)第2.11节组服务 (19)第2.12节对象关系服务 (19)第2.13节时间服务 (20)第2.14节准许服务 (21)第2.15节属性服务 (21)第三章CORBA相关产品及CORBA的未来 (22)第3.01节CORBA相关产品 (22)StarBus的ORB核心机制原理 (23)第3.02节CORBA的未来 (24)第四章程序开发一般过程 (25)第4.01节程序开发一般过程 (25)第4.02节用Starbus开发分布应用步骤 (27)参考文献 (27)引言对象管理组织(OMG)提出的CORBA规范为实现分布式环境下的软件重用、移植和互操作提供了一套前景光明的规范,并为开放式系统的研究提供了一个很好的系统实现框架。
介绍CORBA的文章已有很多,本文试图能够从结构上简而全的对它进行综述,并简单介绍了相关产品和CORBA环境下的程序开发过程。
第一章CORBA 体系结构第1.01节CORBA规范概述CORBA (Common Object Request Broker Architecture)公共对象请求代理架构,是国际对象管理组织(Object Management Group OMG)制定的分布对象计算规范,目前最新版本为3.0(于1999年11月发布),目的是促进在分布、异构环境中基于对象的软件的可重用性、可移植性与互操作性,实现多厂商网络环境中应用的互操作;OMG组织是一个超过750名成员的国际组织,它包括信息系统厂商,软件开发者和用户。
CORBA技术简介
CORBA技术简介⾸先CORBA是⼀个协议,和语⾔和平台⽆关通⽤对象代理体系结构CORBA(Common Object Request Broker Architecture)是对象管理组织所定义的⽤来实现现今⼤量硬件、软件之间互操作的解决⽅案,CORBA也是迈向⾯向对象标准化和互操作的重要⼀步。
■CORBA技术简介 简单地说,CORBA允许应⽤之间相互通信,⽽不管它们存在于哪⾥以及是谁设计的。
CORBA1.1于1991年由OMG发布,其中定义了接⼝定义语⾔(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提供很强的灵活性,它使程序员选择最适合的操作系统、执⾏环境,甚⾄系统各个组件也可以采⽤不同的编程语⾔实现。
更重要的是,它允许现有组件的集成。
网管技术2(CORBA)
2.5 对象引用和对象适配器(OA)
2.5.1对象引用的概念
对象引用(IOR: Interoperable Object Reference) 它是分布环境 中对一个CORBA对象的访问标识 一个CORBA对象可以有多个IOR,IOR相当于一个指针,而 实际指向的只有一个CORBA对象。 IOR中包含了对象的网络地址信息(IP, Port)、相应的对 象适配器(OA)信息以及唯一标识(ObjectId)。但定位机 制与具体的平台有关,所以IOR中的部分信息只有相应的 平台才能完全解读。 对象引用对于编程人员而言可以完全透明。
2011-3-5 10
异构环境下的CORBA平台
IDL
Ada
Java
IDL
IIOP
IDL
Cobol C++
IDL
C
2011-3-5
IDL 11
2.3 Stub 和 Skeleton
Stub(客户桩) :提供了为客户有效创建对象 并发送请求的机制,提供了数据结构的编解 码和远端方法调用的API封装,调用方式是自 上而下; Skeleton(服务框架):提供了将请求发送给服 务器对象的机制,以及对象寻址的部分功能, 调用方式是自下而上。
2011-3-5 16
2.6 对象调用模型
对象接口 对象引用
IOR
对象实现
Client
接口调用 内部接口
Server
2011-3-5 17
6. CORBA的特点
1) 分布式的软件总线 2) 面向对象的体系结构 3) 解决了异构环境下的系统互连 4) 具有良好的扩展性 5) 易学易用 6) 适用于将不同.4 IFR、DII和DSI
TAO使用指南
TAO使用指南发信站: BBS 水木清华站(Thu May 8 18:35:49 2003), 站内最近正在将一个工程由Orbix2000向TAO移植. 将一些心得和经验奉上,算是给DOC版做点贡献... 说的不对, 请大家指正. 同时您有什么心得也不仿写出来嘛:)1. 什么是TAO?TAO是美国华盛顿大学的CORBA界大牛Douglas C. Schmidt博士领导开发的一个实时CORBA平台. 它是一个开放源码项目, 所以是完全免费的.用C++语言开发. 符合CORBA2.6版本.支持语言: C++支持平台: Win32, 常见的各种Unix, Linux, 实时操作系统如VxWorks等等. 在所有的CORBA平台中, TAO支持的平台应该是最多的.支持的服务: Naming, Event, Notification, Security, Time,Scheduling, Logging, Lifecycle, Trading, Concurrency, Lifecycle,A/V Streaming, Load balancing等.2. 网上的TAO资源TAO主页: /~schmidt/TAO.htmlOCI公司宣布对TAO进行技术支持: 它出了一本书叫: TAO Developer's Guide, 上下两卷, 1000页左右, 要250美刀. 吐血买了一本...此外, OCI有自己的TAO发布版本, 最新版本号为1.2a. Win32版本开价50美刀.OCI有一个TAO的FAQ, 很不错, 地址:/faq/index.htmlTAO的Mailing List: tao-users@Mailing List Archive: /group/tao-users3. 下载TAO地址: /目前最新的Release版本是1.3发信人: Mentoya (钻研Orbix2000中...), 信区: DOC标题: TAO使用指南-- 编译ACE和TAO发信站: BBS 水木清华站(Thu May 8 19:11:37 2003), 转信我只用到Win32平台. 现在使用的环境是: WinXP Professional + MSVC SP5.在Win32平台下, 还可以使用C++ Builder来编译和开发TAO. 我没有用过.:-(参见: /~schmidt/ACE_wrappers/TAO/TAO-INSTALL.html------------------------------------------------------------------------TAO完全支持Win32API,(包括Windows NT, Windows 2000, Windows 95/98/ME) VC5.0和VC6.0均可编译。
基于TAO(The ACE ORB)的CORBA编程
CORBA Programming with TAO - 1.Start(基本概念)摘要:简要介绍CORBA的基本原理,并解释POA、stub、skeleton、servant等重要概念。
一、CORBA及TAO简介CORBA是一个为简化跨平台应用而提出的规范,它独立于网络协议、编程语言和软硬件平台,支持异构的分布式计算环境和不同编程语言间的对象重用。
CORBA可以作为不同平台应用间信息传递的中间件,CORBA通过引入经过充分验证的有效的框架结构和通信手段,最大限度地简化了网络通信相关应用的设计与开发,使得我们可以专注于业务逻辑的实现,而无需关心通信的细节。
CORBA曾在无数文章中被称作“软总线”,以表明它作为数据传递通道的基本特性。
现在存在众多CORBA实现,既有商用的ORBacus、VisiBroker,也有一些优秀的开源实现,如:TAO、omniORB、MICO等。
由于各实现遵从相同的规范,接口基本一致,所以在熟练应用一种CORBA实现后,转而使用其它实现时,一般不会存在太大的障碍。
TAO(The ACE ORB)是美国华盛顿大学的Douglas C. Schmidt教授领导开发的一个实时CORBA平台,它是一个免费的开放源码项目,用C++语言开发,符合CORBA2.6规范。
支持语言: C++支持平台: Win32,常见的各种Unix/Linux,实时操作系统如VxWorks等等。
在所有的CORBA实现中,TAO 支持的平台是最多的。
支持的服务: Naming、Event、Notification、Security、Time、Scheduling、Logging、Lifecycle、Trading、Concurrency、Lifecycle、A/V Streaming、Load balancing等。
本系列文章将以当前最新的ACE-5.5+TAO-1.5+CIAO0.5为例,简要介绍如何应用TAO进行CORBA C++编程,其中部分内容(尤其是编译器配置相关的内容)是Windows平台特有的,但其它大多数信息在各平台上都是相同或者类似的。
CORBA编程
CORBA::ORB_var orb=CORBA::ORB_init (argc, argv); // Find the Naming Service CORBA::Object_var NamingObj=orbNamingObj=orb>resolve_initial_references("NameService"); cout<<"Initialize NameService...OK"<<endl; CosNaming::NamingContext_var root=CosNaming::NamingContext::_narrow(NamingObj.in( )); if(CORBA::is_nil(root.in())) { cerr<<"Nil Naming Context reference"<<endl; return 1; } // Get reference to Root POA CORBA::Object_var RootObj=orbRootObj=orb>resolve_initial_references("RootPOA"); PortableServer::POA_var poa=PortableServer::POA::_narrow(RootObj.in()); cout<<"Create RootPOA...OK"<<endl;
CORBA简介 CORBA简介
语言映射 IDL (Interface Description Language) 是 一种说明对象接口的语言。可以将IDL映射成不 一种说明对象接口的语言。可以将IDL映射成不 同的语言,例如:可以映射成C++代码,JAVA 同的语言,例如:可以映射成C++代码,JAVA C++ 代码等。 对象调用示意图
corba介绍(java语言)
1.C ORBA 简介CORBA(Common Object Request Broker Architecture)是为了实现分布式计算而引入的。
为了说明CORBA在分布计算上有何特点,我们从它与其它几种分布计算技术的比较中进行说明。
与过去的面向过程的RPC(Remote Procedure Call)不同,CORBA是基于面向对象技术的,它能解决远程对象之间的互操作问题。
MicroSoft 的DCOM (Distributed Component Object Model)也是解决这一问题的, 但它基于Windows操作系统,尽管到本书编写时,DCOM已有在其他操作系统如Sun Solaris, Digital Unix, IBM MVS 上的实现,但毫无疑问,只有在微软的操作系统上才会实现得更好。
而只有CORBA是真正跨平台的,平台独立性正是CORBA的初衷之一。
另一种做到平台无关性的技术是Java RMI(Remote Method Invocation),但它只能用JAVA实现。
CORBA与此不同,它通过一种叫IDL(Interface Definition Language)的接口定义语言,能做到语言无关,也就是说,任何语言都能制作CORBA组件,而CORBA组件能在任何语言下使用。
因此,可以这样理解CORBA:CORBA一种异构平台下的语言无关的对象互操作模型。
1.1 CORBA体系结构CORBA的体系结构如下:图1.1 CORBA体系结构CORBA上的服务用IDL描述,IDL将被映射为某种程序设计语言如C++或Java,并且分成两分,在客户方叫IDL Stub(桩), 在服务器方叫IDL Skeleton(骨架)。
两者可以采用不同的语言。
服务器方在Skeleton的基础上编写对象实现(Object Implementation),而客户方要访问服务器对象上的方法,则要通过客户桩。
CORBA原理简介与实例
CORBA 原理简介与实例CORBA 核心总体设计规划基于服务的ORB遵循公共ORB 体系结构,可以有很多ORB 的具体实现,比如客户和实现驻留ORB ,基于服务的ORB ,基于系统的ORB 以及基于链接库的ORB 等。
考虑到我们今后利用本平台所作开发项目的具体情况以及我们目前的开发条件与能力,决定选用基于服务的ORB 为开发目标。
这种基于服务的ORB ,对ORB 进行集中式管理,所有的客户实现均可以与一个或多个服务器进行通信,这些服务器的功能是将请求从客户端发送到实现端。
这样的话,ORB 就可以做成一个普通的程序,以便运行在不同的平台上。
总体结构本系统所采用的实现方法为:客户通过动态调用接口和ORB 接口经ORB 核心与具体的对象实现进行交互。
具体结构如下图所示:参照CORBA 2.3规范,本系统工作原理如下:客户首先通过ORB 核心提供的ORB 接口得到一个对象引用。
至于得到一个什么样的对象引用,取决于客户需要的服务。
通常每个服务都会有一个标识,客户就是通过这个标识来识别每一个服务的。
也就是说,客户首先要向ORB 核心提交一个服务标识来请求一种服务。
ORB 核心在得到客户提供的服务标识之后,从它掌握的各个对象适配器(POA )中处于活跃状态的对象实现(服务提供者)中挑选一个。
本系统中,ORB 核心是通过查询一个POA 、对象实现(服务标识)列表来完成这一功能的。
这样的话,ORB 核心返回给客户的对象引用具体地说就是该服务与POA 对在本核心所用于所有ORB 实现的同一接口可能有多个对象适配器上调用 下调用总体结构图持有列表中的位置。
ORB核心又是怎么得到并维护这个POA与服务标识的列表的呢?这个列表的创建与修改都是通过POA来完成的,因为与对象实现(服务提供者)直接交互的是POA,而不是ORB核心。
对于服务是否可用的状态维护,本系统考虑了两种情况:一是ORB先于对象实现而运行;二是对象实现先于ORB而运行。
corba教材
一.CORBA简介Orbix is a software environment that allows you to build and integrate distributed applications. Orbix is a full implementation of the Object Management Group's (OMG) Common Object Request Broker Architecture (CORBA) specification. This chapter introduces CORBA and describes how Orbix implements this specification.The diversity of modern networks make the task of network programming very difficult. Distributed applications often consist of several communicating programs written in different programming languages and running on different operating systems. Network programmers must consider all of these factors when developing applications.The Common Object Request Broker Architecture (CORBA) defines a framework for developing object-oriented, distributed applications. This architecture makes network programming much easier by allowing you to create distributed applications that interact as though they were implemented in a single programming language on one computer.CORBA also brings the advantages of object-oriented techniques to a distributed environment. It allows you to design a distributed application as a set of cooperating objects and to re-use existing objects in new applications.二.IDL语言简介IDL(Interface Defination Lanaguage )是一种接口定义语言,主要功能是定义Server 与Client程序之间的接口,通过编译IDL接口,可以自动生成Server与Client端程序,程序员通过重写Server与Client程序,实现网络编程的功能。
corba培训
主要内容
CORBA基本概念
什么是CORBA CORBA模型
ORBIX软件体系
ORBIX简介 ORBIX安装配置
CORBA程序开发
开发步骤 HELLO WORLD 示例
什么是CORBA?
CORBA—Common Object Request Broker Architecture,中文称为公用对象请求代理体系,从刚 开始只支持c语言,发展到现在支持目前的大量的编程 语言,已经成为软件开发的主流,并被业界广泛接受。
ORBIX介绍
ORBIX是IONA公司开发的符合CORBA 2白皮书的ORB产品
ORBIX安装步骤
1. 检查JAVA版本,需要JAVA 1.3以上版本 2. 运行安装程序,根据提示完成安装 3. 安装LICENSE 4. 设置环境变量
ORBIX安装步骤
现场演示……
ORBIX开发应用
1.使用Toolkit代码生成器来开发 2.只使用IDL编译器来进行开发
Remote Procedure Call(RPC)
面向方法、比socket稍好用些、需要了解好多对方细节
Microsoft Distributed Component Object Model (DCOM)
相对健壮的对象模型、限于Windows
Java Remote Method Invocation (RMI)
4. 开发服务端的程序:这个服务端对这些CORBA对象来说像一个容器一样, 每个都支持一个接口。你必须自己添加代码来为每个类型的CORBA对象提供商业 逻辑方法。服务端通过将对象的引用发送到一个大家都知道的地方,使的这些 CORBA对象对客户端来说有用。
5.开发客户端的程序:客户端用IDL编译器产生对那些需要从服务端响应的 对象的引用进行映射。
一个简单的CORBA例子
⼀个简单的CORBA例⼦因为对CORBA分析的需要,这⾥写⼀个简单的CORBA例⼦。
从JDK1.2开始,JDK中集成了ORB的实现,本例⼦使⽤了JDK1.7,对于JDK1.2+应该都没有问题。
这个例⼦实现⼀个简单的加减乘除的功能的计算器,客户端将参数和请求的⽅法名传送到服务端,服务端处理这个请求并将结果返回给客户端。
我们知道不同编程语⾔中的类型的表达,内存模型是不⼀样的,为此CORBA发明了⼀套中间描述语⾔IDL,不同语⾔平台的ORB实现负责将IDL中的类型映射到本地类型中。
因此IDL是我们编写CORBA程序的出发点,⾸先,我们⽤IDL来描述我们的接⼝/对象:1 module com{2 module bes{3 module corba{4 module test{5interface Calc{6void add(in long a,in long b,out long c);7void sub(in long a,in long b,out long c);8void multi(in long a,in long b,out long c);9void div(in long a,in long b,out long c);11 };12 };13 };14 };15 };当然接⼝Calc中的⽅法的返回值不⼀定为void,这⾥将返回值放到了out类型的参数c中,⽅法可以带有多个out类型的参数。
然后我们⽤idlj ⼯具(jdk⾃带)将Calc.idl转换为对应java的描述,并⽣成Stub和POA等类:idlj给我们⽣成很多⽂件,⾸先我们来看⼀下UML图:上⾯的图不涉及⼯具类CalcHelper和CalcHolder,这两个类的作⽤在后⽽阐述。
package com.bes.corba.test;/*** com/bes/corba/test/_CalcStub.java .* 由IDL-to-Java 编译器 (可移植), 版本 "3.2"⽣成* 从Hello.idl* 2016年2⽉15⽇星期⼀下午09时08分34秒 CST*/public class _CalcStub extends org.omg.CORBA.portable.ObjectImpl implements com.bes.corba.test.Calc{public void add (int a, int b, org.omg.CORBA.IntHolder c){org.omg.CORBA.portable.InputStream $in = null;try {org.omg.CORBA.portable.OutputStream $out = _request ("add", true);$out.write_long (a);$out.write_long (b);$in = _invoke ($out);c.value = $in.read_long ();return;} catch (org.omg.CORBA.portable.ApplicationException $ex) {$in = $ex.getInputStream ();String _id = $ex.getId ();throw new org.omg.CORBA.MARSHAL (_id);} catch (org.omg.CORBA.portable.RemarshalException $rm) {add (a, b, c );} finally {_releaseReply ($in);}} // addpublic void sub (int a, int b, org.omg.CORBA.IntHolder c){org.omg.CORBA.portable.InputStream $in = null;try {org.omg.CORBA.portable.OutputStream $out = _request ("sub", true);$out.write_long (a);$out.write_long (b);$in = _invoke ($out);c.value = $in.read_long ();return;} catch (org.omg.CORBA.portable.ApplicationException $ex) {$in = $ex.getInputStream ();String _id = $ex.getId ();throw new org.omg.CORBA.MARSHAL (_id);} catch (org.omg.CORBA.portable.RemarshalException $rm) {sub (a, b, c );} finally {_releaseReply ($in);}} // subpublic void multi (int a, int b, org.omg.CORBA.IntHolder c){org.omg.CORBA.portable.InputStream $in = null;try {org.omg.CORBA.portable.OutputStream $out = _request ("multi", true);$out.write_long (a);$out.write_long (b);$in = _invoke ($out);c.value = $in.read_long ();return;} catch (org.omg.CORBA.portable.ApplicationException $ex) {$in = $ex.getInputStream ();String _id = $ex.getId ();throw new org.omg.CORBA.MARSHAL (_id);} catch (org.omg.CORBA.portable.RemarshalException $rm) {multi (a, b, c );} finally {_releaseReply ($in);}} // multipublic void div (int a, int b, org.omg.CORBA.IntHolder c){org.omg.CORBA.portable.InputStream $in = null;try {org.omg.CORBA.portable.OutputStream $out = _request ("div", true);$out.write_long (a);$out.write_long (b);$in = _invoke ($out);c.value = $in.read_long ();return;} catch (org.omg.CORBA.portable.ApplicationException $ex) {$in = $ex.getInputStream ();String _id = $ex.getId ();throw new org.omg.CORBA.MARSHAL (_id);} catch (org.omg.CORBA.portable.RemarshalException $rm) {div (a, b, c );} finally {_releaseReply ($in);}} // div// Type-specific CORBA::Object operationsprivate static String[] __ids = {"IDL:com/bes/corba/test/Calc:1.0"};public String[] _ids (){return (String[])__ids.clone ();}private void readObject (java.io.ObjectInputStream s) throws java.io.IOException{String str = s.readUTF ();String[] args = null;java.util.Properties props = null;org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);try {org.omg.CORBA.Object obj = orb.string_to_object (str);org.omg.CORBA.portable.Delegate delegate = ((org.omg.CORBA.portable.ObjectImpl) obj)._get_delegate (); _set_delegate (delegate);} finally {orb.destroy() ;}}private void writeObject (java.io.ObjectOutputStream s) throws java.io.IOException{String[] args = null;java.util.Properties props = null;org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);try {String str = orb.object_to_string (this);s.writeUTF (str);} finally {orb.destroy() ;}}} // class _CalcStub_CalcStub是存根类,有过远程调⽤编程经验的读者应该对这个词⽐较熟悉,它是远程对象在本地的⼀个代理(Proxy)。
corba中间件
Java&CORBA编程实例Java IDL技术在Java平台上添加了CORBA(Common Object Request Broker Architecture)功能,提供了基于标准的互操作能力和连接性。
Java IDL技术使得分布式的Java Web应用能够通过使用工业标准的IDL和IIOP(Internet Inter-ORB Protocol)来透明地调用远程网络服务的操作。
运行时组件(Runtime Components)包括了一个用于分布式计算且使用IIOP通信的Java ORB.可移植对象适配器(Portable Object Adapter,POA)CORBA对象的负责分隔服务器端远程调用句柄(handler)到远程对象和它的服务者(servant)。
对象由远程调用所暴露,而服务者包含实际处理这些请求的方法。
每个对象都可以选择服务者为静态的(一次)或动态的(每个远程调用),在这两种情况下,都允许调用转移到另一台服务器。
在服务器端,POA形成了类似树状的结构,每个POA都负责一到多个服务的对象。
树的分支可以是独立活动的、或钝化的,服务者调用有不同的代码和不同的请求处理策略。
API规范* org.omg.CORBA 包- 提供了OMG CORBA APIs到Java 编程语言的映射* org.omg.CosNaming 包- 为Java IDL提供命名服务* org.omg.PortableServer 包- 为建立服务器端的可移植的、跨越多ORB的应用程序提供类和接口* org.omg.PortableInterceptor 包- 提供了注册ORB钩子的机制,此钩子通过ORB服务能截取正常的ORB执行流* org.omg.DynamicAny 包- 提供了使得任何值都能被动态解释(或遍历)和通过DynAny对象构造出来的类和接口* org.omg.CORBA.ORB - 为CORBA ORB功能的API分布式对象之间的关系有两方面:客户端和服务器。
CORBA技术
4 通过值传递对象
与异步消息服务类似,缺乏通过值来传递对象的能力也是CORBA规范的一大漏洞。CORBA允许数据类型(如整型、结构和数组等)在网络上作为操作参数或者返回结果进行传输。当客户请求某个对象提供的服务时,过去的CORBA版本只允许将目标对象的引用传递给客户,客户根据该引用与目标对象建立连结。由于目标对象不在客户方,所以客户所发出的每个请求和相应的执行结果都必须通过网络进行传输。当客户与目标对象交互频繁时,这无疑会大大增加网络负载,并且影响系统的可靠性。
3) CORBA消息服务
多年来,不少CORBA的研究者和供应商都认为,缺乏对异步消息的强有力支持是CORBA规范的一大漏洞。异步消息较好地解决了大规模分布式系统中协作实体和协作基础设施的不可靠问题。特别是近年来,网络中的便携式计算机和其它手持设备的数量不断增加,协作实体之间的连接中断已经成为常见而又正常的现象。异步消息服务机制在具有这种特征的系统中显得尤为重要。由于缺乏对异步消息服务的支持,与其它的开放式分布处理标准/规范(如RM-ODP)比较,CORBA在支持大规模分布式处理方面已经相形见绌[8]。CORBA消息服务规范就是在这种背景下应运而生的。它的主要内容包括:异步消息服务、与时间无关的调用和消息服务的服务质量。
IDL编译器将Valuetype翻译为宿主语言(如C++和Java等)的类。从这个意义上可以认为,支持Valuetype参数的传递也就等于支持通过值传递对象。但是,需要特别注意的是,CORBA3.0不支持通过值传递“真正的CORBA对象”。从前面的内容可知,虽然Valuetype支持界面类型,但它本身不是真正的CORBA对象,而仅仅是OMG IDL的一个新的数据类型而已。当真正的CORBA对象作为一个远程请求操作的参数时,只能传递它的对象引用。由此可知,CORBA3.0尚未彻底解决有关通过值传递对象的问题。
中间件_5CORBA编程简介
getBalance:查询余额
manage
银行中的储蓄员的实体模型。 accountList :记录当前已开设的
所有帐户。 open:根据帐户标识查找某一帐 户,如果该标识的帐户不存在则 创建一个新帐户。
山东大学计算机科学与技术学院
定义对象接口
// 银行帐户管理系统的对象接口定义 module Bank { // 帐户 interface Account { // 存款 void deposit(in float amount); // 取款 boolean withdraw(in float amount); // 查询余额 float getBalance(); }; // 帐户管理员 interface AccountManager { // 查询指定名字的帐户,查无则新开帐户 Account open(in string name); }; };
简单Corba程序设计
山东大学计算机科学与技术学院
CORBA应用开发过程
CORBA规范并没有限制ORB的具体实现方法,所
以不同厂商对ORB的具体实现方法可能差别很大, 这就导致不同厂商提供的ORB上操作可能有很大的 差异。但基本过程都是类似的。
山东大学计算机科学与技术学院
开发环境
Inprise VisiBroker 4.5 + JDK 1.3 + UltraEdit Inprise Visibroker 5 + JDK 1.4 ( + Jbuilder / SunOne
接口与对象实现之间是多对多关系 对象接口的定义应包括对象的类型名字,对象上可
进行的操作,属性,相关的数据类型定义,常量定
义,异常定义等信息
CORBA应用程序开发过程
CORBA应用程序开发过程下面是CORBA应用程序开发的基本过程:1.需求分析:和其他软件开发项目一样,CORBA应用程序开发的第一步是进行需求分析。
开发团队需要与客户进行讨论,了解他们的需求和预期的应用程序功能。
这些需求包括要支持的对象类型、通信和交互的方式等。
2.接口设计:接下来,需要设计CORBA接口来定义对象之间的通信和交互协议。
CORBA接口使用接口定义语言(IDL)来描述对象的属性、方法和数据类型。
IDL是一种语言中立的描述语言,可以生成各种编程语言的代码。
3.IDL编译:一旦接口定义完成,IDL文件需要被编译成具体编程语言的代码。
CORBA支持多种编程语言,如C++、Java、Python等。
开发团队需要选择适合他们的编程语言,并使用CORBA提供的IDL编译器将IDL文件编译成特定语言的代码。
5.编译和构建:对象实现完成后,代码需要被编译和构建成可执行的应用程序。
这个过程与传统的软件开发流程类似,包括编译、链接和构建可执行文件的步骤。
6.部署和运行:部署CORBA应用程序需要考虑多个因素,如操作系统的兼容性、网络配置等。
开发团队需要确保应用程序可以在目标环境中正确运行,并处理可能出现的网络通信问题。
7.测试和调试:一旦应用程序部署完毕,开发团队需要进行系统测试和调试。
这包括使用各种测试工具和技术来验证应用程序的正确性和性能。
开发团队可能需要使用CORBA测试框架,如TAO(The ACE ORB)来进行测试。
8.维护和更新:一旦应用程序上线,并被用户使用,开发团队需要持续进行维护和更新。
这包括修复错误、添加新功能和进行性能优化。
CORBA应用程序的更新可能涉及到修改IDL文件和重新编译代码。
以上是CORBA应用程序开发的基本过程。
由于CORBA的复杂性和涉及到的多个技术,CORBA应用程序的开发需要经验丰富的开发团队和合适的工具支持。
TAO(实时CORBA)系统构架概述
TAO(实时CORBA)系统构架概述TAO是一个ORB实现,它包含了网络接口,操作系统,通信协议以及CORBA中间件构件和相关特性。
图 1. TAO构架构件 TAO功能•最优化表现层•实时调度服务•实时ORB 核心•最优化对象适配器•针对特殊Qos属 性的实时IDL(RIDL)模式•跨越操作系统 保护域的有效的零拷贝缓冲区管理•一个高性能的 ATM端接口控制器(ATM PortInterfaceController-APIC)•操作系统和网络 资源的实时调度1. G比特I/O子系统一个I/O子系统负责ORB和应用程序对底层网络和操作系统资源,如设备驱动程序,协议栈,CPUs等资源的 访问。
这里很关键的问题是建立一个实时I/O子系统(1)加强在最小化优先反演和不确定性时的QoS保证, (2) 这使应用程序对特殊的QoS需求变得很方便,而且(3)有助于ORB中间件利用通过基本的网络所提供的QoS保证面对这些挑战,我们为华盛顿大学的TAO开发了一个运行在G比特ATM网络之上的高性能的I/O子系统 TAO I/O子系统包括以下构件 (1) 一个高速的ATM端接口控制器(APIC),(2) 一个实时的I/O子系统, (3) 一个实时的调度器, 和(4) 一个 输入控制器, 显示在图 2.图 2. TAO的G比特I/O子系统为了确保应用程序的QoS,TAO从底层的I/O子系统获得保证。
为了完成这个任务,我们正在开发一个高新能的网络I/O子系统。
其系统构件描述如下.1.1. 高速网络适配器我们的I/O子系统的心脏是一个由一个或多个ATM接口控制器芯片(APIC)互 相连接而组成的菊花链 .APIC能作为一个系统/网络接口使用,也能作为I/O接口芯片组使用.它支持一个双向2.4Gbps速率的聚集 .另外, TAO分层结构的设计使它能运行在通常的连接到通过使能QoS的的网络(如支持RSVP的IPv6)和实时互连(如VME底板和多处理器 的共享内存环境)的网络嵌入式平台.1.2. 实时I/O系统TAO通过Solaris和实时操作系统VxWorks等提供了增强的流模式.TAO的实时I/O系统最优化反演和隐藏的调度问题源 于协议的处理中.我们的策略是避免优先反演,用一个核心线程池专用处理协议并且用应用程序的线程关联这些线程. 这些核心线程运行在与应用程序线程同样的优先级别, 这样能防止多种实时调度事故的发生如优先反演和隐藏调度.1.3. 实时调度TAO通过支持周期性实时应用程序的实时I/O调度类来确保支持QoS. 一旦实时I/O类的一个线程被操作系统接纳, 调度程序将负责(1) 计算在类中相关的其它线程的优先级并且(2)周期性地分发这些线程以使它们在最后期限是满足的.TAO实时I/O调度类允许应用程序指定它们在一个高级, 直觉方式下的需求.例如, TAO 实时调度类的一个实现是基于比率单调调度(rate monotonic scheduling)的, 这些应用程序能在它们的计算时间里指定它们的处理需求C 和周期P. 操作系统为实时I/O线程赋于优先级以确保可调度.1.4. 输入控制器为确保应用程序的QoS需求,TAO为实时I/O调度类执行输入控制 .输入控制允许操作系统要么确保指定的计算时间,要么拒绝接收线程. 输入控制对于实时系统在确定和统计QoS 需求方面很有 用处.2. 实时ORB核心TAO ORB核心管理传输连接, 传递客户请求到一个对象适配器,并可能返回响应给客户.它也负责处理应用构件的并发模式.图 3 表示了在TAO ORB核心客户端和服务器端的构件.图 3. TAO的ORB核心构件TAO's ORB 核心是基于高性能,跨平台的ACE构件之上,如接收器和连接器, 感应器,和任务. 图 3 说明了TAO ORB核心的客户端是如何使用ACE的 策略连接器去缓冲到服务器的连接的, 这样就保存在调用和执行之间的连接设置时间和最小化时间(minimizing latencies). 服务器端使用ACE的 策略连接器, 在与感应器的连 接中, 获得连接.感应器 代表着一种连接处理器激活ACE激活策略的方式 (e.g., 一个线程激活策略在图中显示), 将每个线程句柄转到相应的活动对象. 连接处理器从请求中解析出Inter-ORB Protocol(IOP)并把它们 传递到TAO的对象适配器, 并由对象适配器将这些请求分发到伺服程序进行处理.3. 实时对象适配器TAO对象适配器负责对客户请求到对象实现的多路分解和 分发. 一个标准的GIOP兼容性客户请求包含了远程对象实现和操作的标识. 远程对象实现用一个对象键表示,远程操作以一个字符串表示.通常ORB通过以下步骤解析客户对目标对象实现 操作的请求(显示在图4(A)):•第1、2步 -- 操作系统协议栈将输入的客户请求(e.g., 通过数据链路层, 网络层, 和传输层,以及用户/核心 边界)传递到ORB对象适配器.•第3,4,5步 -- ORB核心使用客户对象键信息来定位适当的对象适配器,伺服程序和目标IDL操作的骨架;•第6步 -- IDL骨架定位适当的操作, 编组请求缓冲到操作参数,并且执行上调操作.图 4. 分层和DE分层的多路分解通过所有层的多路分解客户请求的代价是非常昂贵的, 尤其是当在一个IDL接口中存在大量的操作或者是一个ORB管理着大量的对象更表现的如此.为了减少开销, TAO使用de-分层多路分解 (Figure 4(B)).这种近似使用多路分解键(demultiplexing keys)的方式把ORB指派给客户端. 这些键映射客户请求到对象/操作在O(1)时间里不需要任何的哈西运算或搜索.为了将来减少多路分解层的数目,APIC能通过编程和使用ATM虚拟环路的方式直接分发客户请求. 这种策略减少了多路分解的执行时间和支持在每请求或每对象基础上的端对端QoS.4. 通过实时IDL模式实现QoS规范使用TAO的实时应用程序必须明确指定它们要调度的资源请求所需要的TAO的实时调度服务. 在程序执行前,一个基于每操作的QoS信息在程序执行前提供给TAO.为了CPU的需要, 通过 RT_Operations使用RT_Info中的IDLstruct属性来表示Qos需求 图 5.图 5. TAO的QoS规范模型RT_Operation是一个调度操作, i.e.,它通过TAO使用RT_Info struct表 示成一种被调度的资源需求 .RT_Info属性包含了worst-case执行时间周期, 重要的和数据依赖的.使用与RMS和RMA分析方法类似的调度技术,TAO实时调度服务判断在一个应用中是否有一个基于所有RT_Info数 据的知识为所有的RT_Operations的可行度量.这些属性对于通过使用TAO来 (1) 验证调度的可行性和 (2) 定位ORB系统和网络资源是足够的. 目前,开发者必须通过CORBA接口手工来确定这些参数并将它们提供给TAO的实 时调度服务.我们应计划通过创建一个监视examples脚本执行的工具来自动取出这些必要的实时参数.同样,作为真实执行的替代,仿真结果能被 用来为每个操作定义RT_Info属性.5. 实时调度服务TAO的实时调度服务是一个CORBA对象,它具有以下的离线和运行时职责: •离线可行性调度分析 -- 它以调度服务的RT_Info仓库方式处理 离线可行性调度分析的IDL操作注册用以检测CPU的资源是否足够用于请求任务的处理.•线程优先级的指派 -- 在离线分析的过程中,调度服务指派线程的优先级.在运行时,调度服务提供一个接口允许TAO的ORB核心能访问这些优先级 这是它们以操作系统级分发器的形式为接口提供的机制.•协同模式的改变 -- 在运行时,调度服务协同模式的改变.TAO运行时调度模式的参与者显示在图 6中并描述如下:图 6. TAO的调度服务•工作任务 -- 一个Work_Task 是一个工作单元它概括了应用级的处理和通信活动.在一些MDA项目中,一个工作任务也被称为一个 模型 或者 过程, 但是我们避免这些术语因为它们过多使用.•RT_Task -- 一个RT_Task是 一个具有时间约束的工作任务. 每个 RT_Task 被认为 是一种在它们运行时信息 (RT_Info)描述的属性条目中拥有自己特殊的QoS信息的``方法'' (函数). 因此, 一个具有多个方法的应用级对象可能需要多个RT_Task实例.•线程 -- 合作的一组单元. 相关的线程, 有:, 一个Solaris或POSIX 线程, 一个Ada 的任务, 一个VxWorks任务, 或一个Win32线程. 所有的线程被包含在RT_Tasks 中;一个 RT_Task 能包含零个或多个线程. 一个 RT_Task 却不能包含任何只能在另一个RT_Task上下文中运行的线程, i.e., 它必须``借用'' 另一个 控制运行的任务线程(e.g., 对象适配器的) .•操作系统分发器 -- 操作系统分发器使用线程优先级选择下一个运行的线程并将它指派给一个CPU. 当线程被阻塞(即它不能继续运行)或被另一个优先级更高的线程抢占时,操作系统分发器将这个线程从CPU移出. 在抢占的分发中, 任何优先级高的线程将取代优先级低的线程序.在这个时候优先级高的,运行的线程序被分发到CPU上.在我们基于RMA的分析中,假设固定的优先级(fixed priority), i.e., 操作系统不能改变线程的优先级别. 对比这些以时间共享的操作系统调度,典型的是通过降低它们在时间上的优先级而进行age长时间的处理. 因此,从那时的操作系统分发器的视图来看, 每个线程的优先级是不变的.•RT_Info-- 一个RT_Info结构明确讲是一个RT_Task的 调度特性集(比如计算时间和运行周期).•实时调度器 -- 在运行时, 调度服务最重要的部分是实时调度器. 实时调度器在系统中为每个RT_Task管理一个RT_Info 结构. 在使用RT_Info中的一个RT_Task时 , 实时调度器能为RT_Task的调度特性提供查询 (e.g., 一个任务的优先级) . 当前,在RT_Info结 构中的数据代表是离线计算的, i.e., 优先级是静止赋予更早的运行时间.6. 构件和最优化的表现层表现层在一个高性能的通信系统中是个大的瓶颈.这层转换从高级表现到低级表现的操作参数(即编组)反之(解组). 在TAO中,这些转换操作是通过高效的IDL编译器生成的客户桩和服务器框架完成的. 这些杂TAO表现层的优化操作的实现描述如下.6.1. 表现层的优化这种在IDL定义和目标编程语言之间的转换是通过TAO的IDL编译器自动完成的. 此外减少了客户桩和服务器框架之间潜在的不一致性, 编译器支持自动更新优化. TAO IDL编译器被设计成可为IDL类型的编码、解码生成和配置多种策略. 举例, 基于一种运行时应用类型的测量, TAO 既能连接编译,也能解释IDL桩和骨架. 这样一种灵活性能在解释模式(运行速度慢一些,但尺寸会更小一些)和编译模式(速度会更快,但尺寸会大一些) 之前获得一种最佳的平衡点.同样, TAO 能缓冲那些要反复使用的预编组的应用数据单元(ADUs) . 当ADUs在``请求链''被顺序传递时和and 每个ADU在从一处传递到另一处时的细微改变 能提高性能. 在下面的案例中, 在每一次的 整个过程中,ADUs是不必编组的. 最优化要求实时ORB执行应用程序代码的流分析以确定请求字段能否被缓冲.虽然这些技术在一般情况能相当程度减少编组过载 , 有严格实时服务要求的应用程序经常要考虑只有最坏情况的执行. 这样的结果是, 流分析的最优化描述只能使用在确定环境上, e.g., 目的是让应用程序能接收、统计实时服务的或当最坏情况for applications that can accept statistical real-time service or when the worst-case scenarios are still 足够to meet deadlines.6.2. 内存优化管理通常CORBA工具经常忍受过多的动态存储管理和数据拷贝. 因为 堆栈的分段存储能为不同的消息大小和不同的工作量表现出不均匀的性能的原因动态存储管理会是硬盘实时系统的问题. 同样, 在整个ORB端系统中过多的数据拷贝会很大程度上降低端到端的性能.现存的ORBs为多处理器使用动态存储管理. ORB核心通常为每个接收到的客户请求分配存储空间. IIOP解组引擎 通常为保持的解码请求参数分配存储空间. 最终, IDL 分别在上调之前和上调之后动态分配和删除客户端请求时参数的拷贝.这些存储管理策略在一些环境中非常重要(e.g., 当上调生成用于修改它们输入的线程应用时为了防止破坏内部CORBA缓冲区). 然而, 这种策略不需要为实时应用增加内存和总线负载, 和流媒体应用一样(比如 卫星监视和电视会议) 在消耗它们输入而不用立即修改它.TAO 被设计为小型化和清除在多点的数据拷贝. 举个例子, TAO的 ``零拷贝'' 缓冲区管理系统 被描述在允许客户请求被发送和接收和从不会导致任何数据拷贝开销的网络来. 此外, 这些缓冲区能在ORB的不同传输阶段被重新分配和传递. 另外, 集成层处理(ILP) 能用户减少数据的移动. 因为 ILP 需要维护顺序的约束, 我们提供的编译器技术(比如 控制和数据流分析) 用于检测ILP能被有效用于哪些方面.将编译器技术用于表现层和存储管理功能允许我们在不修改标准OMG IDL和CORBA应用程序的情况下优化性能.。
第二章 中间件Corba_初步
山东大学计算机科学与技术学院
2.2.1 ORB体系结构
客 户 服 务 器
界 面 仓 库
动态 调用
IDL 存根
ORB 界面
静态 IDL 框架
动态 框架 调用
对象 适配 器
对象实 现仓库
ORB 核 心(GIOP/IIOP)
所有 ORB 实现都一致的界面 可能有多个对象适配器 依赖 ORB 核心的界面 与每个对象对应的存根或框架
3 找到后,把参数传给该对象,调用它的方法,最后返
回结果。 激活或存储机制。
山东大学计算机科学与技术学院
4 客户方不需要了解服务对象的位置、通信方式、实现、
ORB基本原理
山东大学计算机科学与技术学院
2对象服务
作用:提供所有应用程序都可能用到的通用服务的接
口(基本服务,与具体的应用领域无关的接口)。
现有成员800多个,负责制定协议、实现基于
协议的软件产品、应用软件产品。
山东大学计算机科学与技术学院
OMG
为使该组织所采纳的技术具有开放性,OMG所 采用的方法是,针对某一领域发出RFP(Request For Proposal), 然后以各方提交的建议为基础,经过一系
列的讨论和协商,产生最终的规范。
3 公共设施
与对象服务不同的是,公共设施面向最终用户的应
用,它是各种应用可以共享的一系列服务集合。
复合文档的管理工具,数据库存取工具、文件打印
工具、电子邮件服务都等属于公共设施。
其标准化使得通用操作具有统一性,
山东大学计算机科学与技术学院
4 域接口
针对着某一特殊的应用领域。 可以按不同的应用领域来组织领域接口 按不同应用领域制订与发布一系列领域接口规范 目前:财务金融,电信,运输,电子商务,仿真等
CORBA
用户界面 用户界面 事务逻辑 用户界面 事务逻辑(1) 事务逻辑 数据存取 数据存取 事务逻辑(2) 数据存取
应用系统的发展(2)
• Multitier Client/Server
提高系统的柔韧性,可维护性
用户界面 事务逻辑 数据存取
• Distributed System
相互调用、CS混合、规范接口、柔韧性可维护性更高
业务对象1 数据存取 对象ห้องสมุดไป่ตู้
界面对象 业务对象3
业务对象2
分布式应用系统
面向对象 对象间相互调用,不区分C、S 只要保持接口不变,实现可以任意改动 服务
目录服务、事务服务、安全等 随着应用系统的日益复杂,除了业务实现以外,需要考虑的问题越 来越多 数据存取
相对健壮的对象模型、限于Windows
Java Remote Method Invocation (RMI)
与CORBA相似、Java-only
CORBA的优缺点
跨语言、跨平台 开放、标准、互操作 易于用来搭建应用架构 开发效率高 组件体系、易扩展 诸多服务、设施 门槛稍高、入门较困难
CORBA的发展
服务端主程序
Server.cpp
// Create ORB and BOA CORBA_ORB_var orb = CORBA_ORB_init(argc, argv); CORBA_BOA_var boa = orb -> BOA_init(argc, argv); // Create implementation object calculator_var p = new calculator _impl; // Save reference CORBA_String_var s = orb -> object_to_string(p); const char* refFile = "Hello.ref"; ofstream out(refFile); out << s << endl; out.close(); // Run implementation boa -> impl_is_ready(CORBA_ImplementationDef::_nil());
CORBA基础理论
• 三者具有内在的一致性:自治、协作 • 分布对象技术的核心: 分布对象模型,以及分布对象间的互操作 • 分布对象技术的实现: OMG的CORBA
Corba的发展历史
• 1.0 (Oct. 1991~Dec.1993)
– 接口定义语言 (IDL) – IDL到C语言的映射 – BOA( Basic Object Adapter)和内存管理
– – – – –
接口方法中参数的方向属性 异常:用户自定义异常和系统异常 oneway操作 module、include 允许多重继承,与实现(implementation)无关
Corba的体系架构
• stub与Skeleton
– Stub idl编译后生成的客户端代码。为接口中的 每个操作提供一个虚的实现,不同的Corba厂 家的实现不同,idl编译出来的stub代码也可能 不同。Stub实际不负责对象的实现,它只是远 端对象在本地的一个“代理”,它接受来自本 地的客户端调用,然后将调用传给ORB核心; 远端操作返回后,它再将从ORB核心收到的返 回结果传递给客户。
什么是Corba
• OMG (Object Management Group) :是一个由会员赞助而成立的非 营利组织, 其目的在推广面向对象 (Object-Oriented) 的观念及使用并致力于 加强软件的可移植性 , 重用性, 以及互通 性 。 該组织会员包括了厂商、学术机构 及用戶。 • Common Object Request Broker Architecture是OMG1991年提出的面向对 象分布式环境标准,发布后多次被修订, 目前版本是3.0.2。
• IDL语言简介
– IDL 是 CORBA 的基本抽象机制,其核心是将对象实现 与对象接口相分离,它在客户应用和服务器应用之间 建立起一个标准的描述语言,描述在应用程序中需要 用到的类型和对象接口,这些描述与具体的实现语言 无关。IDL 定义由IDL 编译器映射到具体的编程语言, IDL 编译器将这些与语言无关的接口定义翻译成特定编 程语言的类型定义和API,开发者使用这些类型和API 来提供应用程序的功能和与 ORB 的交互。IDL 到各种 实现语言的转换是由 CORBA 确定的,并称为语言映 射(Language mapping)。目前,CORBA 定义了 IDL 到C,C++, Smalltalk,COBOL,Ada 和 Java 等语 言的映射。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CORBA Programming with TAO - 8.Event Service(事件服务)摘要:事件服务(Event Service)通过在通信的双方甚至是多方间引入一个第三方――Event Channel,一定程度上解除Client和Server之间的耦合关系,在通信的过程中,任意一方只需与Event Channel打交道,而无需确切知道对方的存在,从而使得二者由一对一的关系变成多对多的关系。
一、简介CORBA除了前面讲过的基本的Naming Service(命名服务)外,还定义了许多其它服务,Event Service就是其中的一个。
标准的CORBA通信模式中,Client与Server之间的通信是直接的,Client向Server发出调用请求,Server进行处理并返回结果,这种处理方式下,二者之间是完全耦合在一起的一对一的关系。
而Event Service则通过在二者之间引入一个第三方--Event Channel,可在一定程度上解除Client和Server之间的耦合关系,在通信的过程中,任意一方只需与Event Channel打交道,而无需确切知道对方的存在,从而使得二者由一对一的关系变成多对多的关系。
CORBA的Event Service定义了两种通信模式:推模式(Push Model)与拉模式(Pull Model)。
在推模式下,PushSupplier向Event Channel发送消息,由Event Channel向Cusumer转发消息;在拉模式下,PullConsumer向Event Channel请求消息,由Event Channel向Supplier转发该请求。
但是,并不是说PushSupplier只能与PushConsumer通信,PullSupplier只能与PullConsumer通信,由于Event Channel提供的代理同时也扮演着Supplier/Consumer的角色,因此,在实际应用中,我们可以混合使用两种模式,后面的实例将演示PullSupplier与PushConsumer通过Event Channel连接的例子,这种情况下,代理一方面不断地主动从Supplier处请求消息(默认时间间隔1秒),另一方面,又主动将收到的消息向Consumer发送。
二、编译与Naming Service一样,Event Service也是TAO的一个独立的Service,其源代码可以在$TAO/orbsvcs/CosEvent_Service下找到,但是前面介绍的CIAO_TAO.mwc产生的工程文件仅包含了TAO的少数几个Service,因此,要编译Event Service需要通过在$TAO_ROOT目录下运行:mwc.pl -type vc8 TAO.mwc以产生包含所有TAO实现的Service的工程文件。
在执行上述命令前,最好将TAO.mwc的内容改为:// TAO.mwc,v 1.2 2003/08/22 15:23:48 dhinton Expworkspace {exclude {CIAOexamplesperformance-teststestsorbsvcs/testsorbsvcs/performance-testsorbsvcs/examples}}否则,过多的测试工程将使得上述命令需要很长的时间才能执行完毕。
三、实例下面举一个PullSupplier的例子,PullSupplier必须从POA_CosEventComm::PullSupplier派生,并实现该接口定义的三个基本方法:CORBA::Any* pull();CORBA::Any* try_pull(CORBA::Boolean & has_event);void disconnect_pull_supplier ();PullSupplier周期性会收到来自ProxyPullConsumer的pull请求,要求从PullSupplier 取得消息。
下面是该实例的相关代码:// Notes: just for demo, no exception handle#include<orbsvcs/CosEventCommS.h>#include<orbsvcs/CosEventChannelAdminC.h>#include<orbsvcs/CosNamingC.h>////////////////////////////////////////////////////////////////#include<process.h>#include<stdio.h>//////////////////////////////////////////////////////////////#include<iostream>using namespace std;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////class Supplier_i : virtual public POA_CosEventComm::PullSupplier {public:Supplier_i () : l(0) {};// each PullSupplier must implement the following three methods.CORBA::Any*pull();CORBA::Any* try_pull(CORBA::Boolean &has_event);void disconnect_pull_supplier ();private:CORBA::Ulong l;};void Supplier_i::disconnect_pull_supplier (){cout << "Pull Supplier: disconnected by channel." << endl;}CORBA::Any* Supplier_i::pull(){cout << "Pull Supplier: pull() called. Data : ";CORBA::Any *any = new CORBA::Any();*any <<= l++;cout << l-1 << endl;return (any);}CORBA::Any* Supplier_i::try_pull(CORBA::Boolean &has_event){cout << "Pull Supplier: try_pull() called. Data : ";CORBA::Any *any = new CORBA::Any();*any <<= l++;cout << l-1 << endl;has_event = 1;return (any);}int main(int argc, char **argv){const char* channelName = "CosEventService";CORBA::Object_var obj;// Start orb.CORBA::ORB_ptr orb = CORBA::ORB_init(argc,argv);// find RootPOAobj = orb->resolve_initial_references("RootPOA");PortableServer::POA_var rootPoa = PortableServer::POA::_narrow(obj);// find and activate POAManagerPortableServer::POAManager_var pman =rootPoa->the_POAManager();pman->activate();// find NameServiceobj = orb->resolve_initial_references("NameService");CosNaming::NamingContextExt_var ncRef =CosNaming::NamingContextExt::_narrow(obj); cout << "Find NameService" << endl;// search for EventChannel though NameServiceCosNaming::Name_var name = ncRef->to_name(channelName);obj = ncRef->resolve(name);CosEventChannelAdmin::EventChannel_var channel =CosEventChannelAdmin::EventChannel::_narrow(obj); cout << "Find EventChannel" << endl;// find SupplierAdmin on this channelCosEventChannelAdmin::SupplierAdmin_var supplier_admin;supplier_admin = channel->for_suppliers ();cout << "Find SupplierAdmin" << endl;// find ProxyPullConsumer under this SupplierAdminCosEventChannelAdmin::ProxyPullConsumer_var proxy_consumer;proxy_consumer = supplier_admin->obtain_pull_consumer ();// create PullSupplierSupplier_i* supplier = new Supplier_i ();CosEventComm::PullSupplier_var supplierRef = supplier->_this();// Connect PullSupplier with ProxyPullConsumerproxy_consumer->connect_pull_supplier(supplierRef.in());orb->run();// cut off connection with ProxyPullConsumerproxy_consumer->disconnect_pull_consumer();cout << "Disconnect ProxyPullConsumer." << endl;// Destroy the POA, waiting until the destruction terminatesrootPoa->destroy (1, 1);orb->destroy ();return 0;}从上面的代码可以看出,PullSupplier的基本调用序列为:1、初始化ORB、查找rootPOA并激活POA Manager、查找Name Service并通过Name Service与事件通道取得联系;(这一步与前面讲的Name Service的例子并无差异)2、在找到对应的事件通道后,PullSupplier通过channel->for_suppliers()找到对应的SupplierAdmin,进而通过SupplierAdmin找到ProxyPullConsumer,这样我们就可以向该代理注册我们的PullSupplier了。