Corba应用之TAO 实现库ImR(Implementation Repository)的使用

Corba应用之TAO 实现库ImR(Implementation Repository)的使用 作者: [email protected] 零、前言 这篇文章是在学习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 . Activator <> not found!),主要是因为缺少了中间ImR_Activator的过程,所以该样例无法正常运行。下列过程在Server的当前目录下运行。 1) 首先运行ImplRepo_Service $TAO_ROOT/orbsvcs/ImplRepo_Service/ImplRepo_Service -o implrepo.ior -d 0 -ORBobjrefstyle URL & 2)然后运行ImR_Activator $TAO_ROOT/orbsvcs/ImplRepo_Service/ImR_Activator -ORBInitRef ImplRepoService=file://implrepo.ior & 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" 系统返回: Imr Activator: Register server childPOA. Successfully registered server 这表明服务已经注册成功 4)启动服务用来生成IOR文件,并且写入stock_factory.ior文件 $tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior ior childPOA -f stock_factory.ior 5)应用启动时将把stock_factory.ior文件作为参数传递出去,并且自动进入到实现库ImR服务中,如果服务没有启动,则实现库ImR启动服务。 如果一个服务当前不再被应用所使用,则可以通过如下命令关闭: $tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior shutdown childPOA 如果一个服务任何时候都不再被使用,则可以从ImR数据库中去除它: $tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior remove childPOA 6)客户端应用 ./client file://stock_factory.ior MSFT RHAT 返回: The price of a stock in "Microsoft, Inc." is $91 The price of a stock in "RedHat, Inc." is $210 测试一下持久化POA的运行情况,把当前服务停掉: $tao_imr -ORBInitRef ImplRepoService=file://implrepo.ior shutdown childPOA 则再执行./client file://stock_factory.ior MSFT RHAT 返回: The price of a stock in "Microsoft, Inc." is $91 The price of a stock in "RedHat, Inc." is $210 结果情况说明,虽然服务被停掉,但是客户端应用可以通过ImR机制完成服务的调用。 四、在实现库ImR机制中,服务Server实现需要做哪些工作 1.在以前的版本中,实现库需要显式的使用IR_Help类,现在只需要使用-ORBUseImR 1参数说明即可。 2.Server实现需要一些限制,在Server中,只有持久化的POA才能被ImR支持,并且Server中的POA名称作为ImR的key作为入口索引,换句话说,一个Server只能有一个唯一的持久化的POA。 五、ImR -ORBDefaultInitRef参数的使用 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上了。 应用可以通过缺省参数-ORBDefaultInitRef使用名字服务: client -ORBDefaultInitRef corbaloc:iiop: doriath:5555 当应用调用resolve_initial_reference(“Nameservice”),ORB将解析成“corbaloc:iiop:doriath:5555/NameService”,此时ImR就可以识别这个IOR并作为一个指针定位到实际的NameService,然后在需要的情况下启动这个NameService服务,最后,应用连接到该名字服务上。 2.以缺省参数的方式使用一个服务必须满足两个条件 1)这个服务必须注册成resolve_initial_reference调用的名字。比如,Name服务必须注册成“NameService”,并且也包含一个POA,这个POA的名字也要是“NameService” 2)这个服务必须能够处理这个名字"corbaloc:iiop:machine:port/poa_name" 六、服务Server被激活的模式 1) NORMAL 缺省的方式。应用发出请求,然后自动通过tao_imr 方式激活 2) MANUAL 手动方式。通过手动tao_imr命令行方式激活 3) PER_CLIENT 每个应用请求会激活一个新的服务进程启动。 因为每个客户端缓存前面的引用,所以一个客户端对应一个服务。这也会有一些异常,比如最原始的IOR被用于不同的线程(每个线程获得不同的服务)。因为在这种模式下实现库并不保存每个启动的服务的信息,所以它也就不能关闭服务,由此这个服务必须有一个可以被关闭的的方式。 4) AUTO_START 当实现库启动时,服务自动启动。tao_imr也有一个自动启动的命令,可以自动启动标记为自动方式的所有服务。 七、未来实现库的发展: 未来实现库使用ORT(Object Reference Template)技术,这个技术使的实现库可以省去ImR_Activator的中间过程,只需要IO指向ImplRepo_Service即可。
发布了14 篇原创文章 · 获赞 2 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章