Corba应用之TAO 实现库ImR(Implementation Repository)的使用
Corba应用之TAO 实现库ImR(Implementation Repository)的使用
作者: wulanshi@163.com
零、前言
这篇文章是在学习ACE_wrappers\TAO\docs\tutorials\Quoter\Simple\Impl-Repo\范例时碰到问题时才想到写的,按照范例的步骤是无法运行(Implementation Repository)样例的,后来研究了相关了README文档才找到了问题所在,于是为了方便后来的同学者,并把相关的阅读材料翻译出来,整理成了下面的文章。由于自己的学识有限,也可能原文本身就有含糊之处,所以可能其中有翻译不准或理解不精确之处,希望大家体谅,并指正出来。
一、本文术语约定:
实现库:本身也是一个CORBA的服务(系统自带)
服务:指要被 应用 调用的实体,本身也是一个CORBA服务(一段程序,非系统服务),注册在实现库中
应用:泛指客户端的的应用程序,和客户端同意,这个应用程序可能与服务在一台机器上,也可能在不同的机器上,用来调用服务
二、实现库的概述:
当某个应用调用某个服务时,相关的请求先发送到实现库,如果该服务没有启动,则先启动这个服务,然后把调用转发到这个服务。当服务激活时,实现库用来跟踪某个服务,并且记录下相关的信息,以便于下次重新激活这个服务。
三、实现库的使用方法:
一个应用如果要去使用实现库中的某个服务,这个服务必须通过ImR文件通信方式,以实现跟踪和同步服务的最新运行状态。这个功能已经包含在POA中,所以一个服务使用持久化POA,并且别指定-ORBUseImR参数,那么它将能够和实现库保持通信。
ImR的特性用来提高tao系统的吞吐量和平衡度,它使的实现库可以把任务分解成ImplRepo_Service 和ImR_Activator两层来实现。
1.ImplRepo_Service
ImplRepo_Service“实现库”实现的主要程序,它对使用ImR的应用是可见的,它接受一个来自于tao_ImR的请求,然后把这个请求分派到注册过的ImR_Activator上。ImplRepo_Service是无状态的,除了注册在其上的ImR_Activato信息,其他信息都不维护。它的任务是作为一个应用和实际执行请求的ImR_Activator中间媒介。
到目前为止,任何时刻只能有一个ImplRepo_Service可以运行,通过常用的方法,如-ORBInitRef、-ORBDefaultInitRef 或者广播(multicast)的方式都可以调用到ImplRepo_Service。
ImplRepo_Service程序运行的参数:
-d 调试信息的开关,缺省是打开,0 是关闭
-m 支持广播发现
-o 如果想生成ior文件,该参数后跟一个文件名
当然,还有其他与ORB相关的参数。可以加参数-h查看具体的命令格式,下文也有示例。
2.ImR_Activator
ImR_Activator是真正执行的实体,它可以激活服务、关闭服务,也可以维护与它相关的各个服务程序的信息。一台主机上只能运行一个ImR_Activator实例,ImR_Activator对应用是透明的,只有ImplRepo_Service可以直接和它接触,也只有ImplRepo_Service才需要它。
一个ImR_Activato实例首先要使用ImplRepo_Service进行注册,这样才可以接受请求。当进行注册时,它传递当前的主机名和它自己的IOR文件给ImplRepo_Service。在以后ImplRepo_Service访问它时,会使用到这些同样的信息。
ImR_Activator程序运行的参数:
-c 运行的服务命令
-d 打印调试信息
-l 锁住数据库
-o 生成 IOR文件,用于可能其他的需要此信息
-r 允许WIN32注册实现
-t 设一个延时时间
-h 打印帮助信息
当一个持久化的ImR_Activator被请求时,可能需要保存一些信息,如启动参数、定位信息、工作目录动。这些信息可以设置参数保存在一个文件里,保存的格式如下:
-p 传递一个ImplRepo_Service文件名,用ACE_Configuration_Heap方式存储
-x 存储在一个XML格式的文件 里
存储的这些信息可以在与具体服务相关的tao_imr里作为参数传递。
3.工作过程
1)运行一个ImplRepo_Service。
只有ImplRepo_Service running运行,才能实例化应用需要的一个或多个ImR_Activato。
2)选择ImR_Activator
当一个服务需要新增到实现库,或者一个已经存在的服务需要更新时,一个请求就通过tao_imr程序发送到ImplRepo_Service,如上所说,启动的命令、工作目录、服务的当前主机以及其他的信息都要通过tao_imr传递给ImplRepo_Service。ImplRepo_Service在传递过来的主机中选择ImR_Activator来激活相应的服务,如果选择不到相应的ImR_Activator,则通过一定的算法来选择。一旦一个ImR_Activator被选择,它还需要对激活的服务的生命周期负责。
3)执行服务
当ImR_Activator被选中后,ImplRepo_Service传递相关的请求给ImR_Activator,这个ImR_Activator调用服务执行相关的请求,并且更新它的数据库以反应服务的最新状态。
4.ImR的运行及使用
结合TAO 1.4 关于Implementation Repository文档(见ACE_wrappers\TAO\docs\tutorials\Quoter\Simple\Impl-Repo\index.html)来说明,本人在linux9.0 环境下根据该文档提供的步骤无法进行服务的注册(返回Could not register server <childpoa>. Activator not found!),主要是因为缺少了中间ImR_Activator的过程,所以该样例无法正常运行。下列过程在Server的当前目录下运行。 <br>1) 首先运行ImplRepo_Service <br>$TAO_ROOT/orbsvcs/ImplRepo_Service/ImplRepo_Service -o implrepo.ior -d 0 -ORBobjrefstyle URL & <br>2)然后运行ImR_Activator <br>$TAO_ROOT/orbsvcs/ImplRepo_Service/ImR_Activator -ORBInitRef ImplRepoService=file://implrepo.ior & <br>3)$TAO_ROOT/orbsvcs/ImplRepo_Service/tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior add childPOA -c "./server -ORBUseIMR 1 -ORBobjrefstyle URL -ORBInitRef ImplRepoService=file://implrepo.ior" <br>系统返回: <br>Imr Activator: Register server childPOA. <br>Successfully registered server <childpoa><br>这表明服务已经注册成功 <br>4)启动服务用来生成IOR文件,并且写入stock_factory.ior文件 <br> $tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior ior childPOA -f stock_factory.ior <br> 5)应用启动时将把stock_factory.ior文件作为参数传递出去,并且自动进入到实现库ImR服务中,如果服务没有启动,则实现库ImR启动服务。 <br> 如果一个服务当前不再被应用所使用,则可以通过如下命令关闭: <br> $tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior <br> shutdown childPOA <br> 如果一个服务任何时候都不再被使用,则可以从ImR数据库中去除它: <br> $tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior <br> remove childPOA <br> 6)客户端应用 <br> ./client file://stock_factory.ior MSFT RHAT <br> 返回: <br> The price of a stock in "Microsoft, Inc." is $91 <br> The price of a stock in "RedHat, Inc." is $210 <br> 测试一下持久化POA的运行情况,把当前服务停掉: <br> $tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior <br> shutdown childPOA <br> 则再执行./client file://stock_factory.ior MSFT RHAT <br> 返回: <br> The price of a stock in "Microsoft, Inc." is $91 <br> The price of a stock in "RedHat, Inc." is $210 <br> 结果情况说明,虽然服务被停掉,但是客户端应用可以通过ImR机制完成服务的调用。 <br>四、在实现库ImR机制中,服务Server实现需要做哪些工作 <br> 1.在以前的版本中,实现库需要显式的使用IR_Help类,现在只需要使用-ORBUseImR 1参数说明即可。 <br> 2.Server实现需要一些限制,在Server中,只有持久化的POA才能被ImR支持,并且Server中的POA名称作为ImR的key作为入口索引,换句话说,一个Server只能有一个唯一的持久化的POA。 <br>五、ImR -ORBDefaultInitRef参数的使用 <br>1.一个基本的(或缺省的)IOR被作为默认参数被ORB传递。当resolve_initial_reference方法被调用时,这个ORB会把sevice名称附加在基本的IOR里,形成一个完成的IOR。使用这样的ImR时,会有一个非常有用的特征,就是当ImR's endpoint被作为基本的IOR使用时,那么这个ImR可以通过resolve_initial_reference方法的调用提供许多服务。比如,如果一个ImR service运行在一个主机为doriath端口为5555上,那么可以认为名字服务也已经注册在这个ImR service上了。 <br> 应用可以通过缺省参数-ORBDefaultInitRef使用名字服务: <br> client -ORBDefaultInitRef corbaloc:iiop: doriath:5555 <br> 当应用调用resolve_initial_reference(“Nameservice”),ORB将解析成“corbaloc:iiop:doriath:5555/NameService”,此时ImR就可以识别这个IOR并作为一个指针定位到实际的NameService,然后在需要的情况下启动这个NameService服务,最后,应用连接到该名字服务上。 <br> 2.以缺省参数的方式使用一个服务必须满足两个条件 <br> 1)这个服务必须注册成resolve_initial_reference调用的名字。比如,Name服务必须注册成“NameService”,并且也包含一个POA,这个POA的名字也要是“NameService” <br> 2)这个服务必须能够处理这个名字"corbaloc:iiop:machine:port/poa_name" <br>六、服务Server被激活的模式 <br> 1) NORMAL <br> 缺省的方式。应用发出请求,然后自动通过tao_imr 方式激活 <br> 2) MANUAL <br> 手动方式。通过手动tao_imr命令行方式激活 <br> 3) PER_CLIENT <br> 每个应用请求会激活一个新的服务进程启动。 <br> 因为每个客户端缓存前面的引用,所以一个客户端对应一个服务。这也会有一些异常,比如最原始的IOR被用于不同的线程(每个线程获得不同的服务)。因为在这种模式下实现库并不保存每个启动的服务的信息,所以它也就不能关闭服务,由此这个服务必须有一个可以被关闭的的方式。 <br> 4) AUTO_START <br> 当实现库启动时,服务自动启动。tao_imr也有一个自动启动的命令,可以自动启动标记为自动方式的所有服务。 <br>七、未来实现库的发展: <br> 未来实现库使用ORT(Object Reference Template)技术,这个技术使的实现库可以省去ImR_Activator的中间过程,只需要IO指向ImplRepo_Service即可。</childpoa></childpoa>
分享到:
相关推荐
《CORBA Programming with TAO》是一篇专门为CORBA编程初学者准备的文章,它详细介绍了如何使用TAO(The ACE ORB)这一实现CORBA标准的开源ORB(对象请求代理)。TAO是ACE(Adaptive Communication Environment)...
3. **ACT (Advanced CORBA Tools)**: ACT通常是一系列工具和库,辅助开发者使用TAO进行CORBA开发,包括构建系统、测试框架等。 4. **C++**: TAO是用C++语言实现的,C++的面向对象特性使其成为实现复杂分布式系统的...
CORBA Programming with TAO,整理自“大卫的思维空间”,内容简洁,快速入门。格式制作为CHM,方便阅读。
这通常涉及设置环境变量、下载和安装ACE和TAO库,以及使用特定的编译器选项来生成CORBA对象。 **3. 常用基本方法解析** "4_Basic Functions - 常用基本方法解析"章节介绍了如何创建和使用CORBA对象,包括接口定义、...
### 相关知识点 ...通过以上知识点的学习,开发者可以快速掌握如何使用C++Builder 6结合TAO进行CORBA应用的开发,包括创建项目、编写IDL文件、编写客户端和服务端代码以及构建和安装ACE+TAO等关键环节。
TAO(The ACE ORB)是ACE(Adaptive Communication Environment,自适应通信环境)项目的一部分,是一个高效的、可移植的CORBA实现。VS2008(Visual Studio 2008)是微软的一款集成开发环境,广泛用于Windows平台的...
本文主要探讨了如何在Oracle应用服务器(OAS 4.0)中实现Java CORBA(JCORBA)技术。JCORBA是Java对Common Object Request Broker Architecture(CORBA)规范的实现,它允许Java应用程序与其他支持CORBA标准的系统...
在C++中实现CORBA,可以利用其强大的面向对象特性,实现高效且灵活的分布式应用。 **1. CORBA的核心概念** - **ORB (Object Request Broker)**:对象请求代理是CORBA的核心组件,它负责对象的定位、调用以及消息...
在这个实例中,我们将探讨CORBA的基础概念、主要组件以及如何使用它来创建一个简单的计算器应用。 首先,我们需要了解CORBA的核心组件。ORB(Object Request Broker)是CORBA系统的心脏,它负责对象之间的通信,...
本篇文章详细介绍了如何开发一个简单的CORBA应用实例,涵盖了从定义IDL文件到实现服务器端和客户端的全过程。CORBA为开发者提供了一种高效的方式来构建分布式系统,通过标准化的接口定义和服务调用机制,使得不同...
TAO实现了CORBA 2.6规范,特别强调实时性能,因此它在大规模通信和计算机系统中有广泛应用。TAO结合了ACE(Adaptive Communication Environment),一个免费开源的面向对象框架,用于实现并行通信软件核心设计模式。...
CORBA(Common Object Request Broker Architecture,公共对象...同时,熟悉ORB的具体实现(如omniORB、Tao等)及其提供的工具和API也非常重要。随着深入学习和实践,开发者可以掌握如何构建可靠、高效的分布式系统。
- **初始化ORB:** 应用程序首先需要初始化ORB(Object Request Broker),这是CORBA系统的核心组件之一,负责处理对象之间的通信请求。 - **绑定对象:** 客户端通过ORB绑定到远程的 `Account` 和 `AccountManager` ...
在本主题中,我们将深入探讨如何使用CORBA实现迭代器,以及涉及的两种方法:通过IOR文件和命名服务。 首先,我们来看`goldmine.idl`文件。IDL(Interface Definition Language)是CORBA中的一个关键部分,用于定义...
Java IDL 允许开发者使用熟悉的 Java 语法来定义接口,并将这些接口转换为 CORBA 接口,从而使得 Java 应用能够与其他支持 CORBA 的应用进行通信。 2. **CORBA ORB for Java**:CORBA ORB 是实现 CORBA 规范的关键...
【TAO CORBA CPP 编程指南 C++】是一份详细介绍如何使用TAO(The ACE ORB)在C++环境中进行CORBA编程的文档。TAO是由美国华盛顿大学的Douglas C. Schmidt教授领导开发的实时CORBA平台,它是一个遵循CORBA 2.6规范的...
- **编程示例**:书中详细介绍了如何使用CORBA进行编程,包括如何定义接口、实现对象以及如何使用ORB进行对象间通信。 #### 五、CORBA的常用服务 - **命名服务**:提供全局唯一标识符,帮助客户端定位所需的服务...
本文将围绕“实时CORBA实现机制”的主题,详细探讨其实现原理、关键技术和应用实践。 ### 实时CORBA体系结构与线程控制机制 实时CORBA的核心在于优化了原有的CORBA体系结构,以适应实时系统的需求。具体而言,实时...
总结,使用CORBA构建分布式应用程序,可以实现复杂系统的模块化,提高软件的可维护性和复用性。通过用户登录、会话管理等实例,我们可以看到CORBA如何帮助我们跨越网络和语言的障碍,创建出高效、灵活的分布式应用。