【已阅】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),而客户方要访问服务器对象上的方法,则要通过客户桩。
- 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了。