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

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即可。

你可能感兴趣的:(server,redhat,service,Microsoft,File,reference)