CORBA Programming with TAO - 6.Naming Service(使用命名服务)

CORBA Programming with TAO - 6.Naming Service(使用命名服务)

摘要:

命名服务(Naming Service)是CORBA定义的诸多服务中比较常用的一个, Naming Service提供的助记符解析服务使得应用程序可以借助助记符,而不是一大串IOR来访问到相应的Servant

一、简介

直接将IOR串在程序间传递的做法往往比较不方便,特别是,对于非持久servant来说,每次重启Server程序时,这个IOR都会发生变化,在使用上比较不便,而且,当我们需要访问的servant不是一个,而是多个时,使用IOR就更加不便了。为此,CORBA定义了Naming Service服务,命名服务(Naming Service,不过大家叫的更多的是命名服务)是CORBA最基本的服务之一。Server程序将servant注册到Naming Service中,Client程序就可以借助助记符,而不是一大串IOR来访问到相应的Servant了。

TAO对标准的名字服务进行了扩展,使得可以利用multicast来得到名字服务。此外,TAO还提供了NT_Naming_Service,可以将名字服务注册为NT服务进行管理。

二、启动Naming Service

名字服务的文件名为:Naming_Service.exe,它的启动参数有:

% Naming_Service [-ORBNameServicePort nsport]

[-o ior_output_file]

[-p pid_file_name]

[-s context_size]

[-t time]

[-f persitence_file_name]

[-b base_address]

[-m (1=enable multicast responses,0=disable(default)]

 

-ORBNameServicePort nsport:指定名字服务监听multicast包的端口号。只有在使用了'-m 1'时才有效.

-o ior_output_file: 指定文件名,用来保存名字服务的根上下文的IOR.

-p pid_file_name: 指定文件名,用来保存名字服务程序的进程id

-s context_size: 当创建上下文时, 指定新上下文使用的哈希表的大小,默认1024

-t time: 名字服务监听的时间,单位:秒。默认: 无限

-f persistence_file_name: 指定文件名,用来存放名字服务中被绑定的对象引用。

-m (1=enable multicast responses, 0=disable(default): 是否使用多播功能。

 

运行名字服务时,可以使用-ORBEndpoint参数来指定其运行的端点(有关-ORBEndpoint的详细内容参见文档: $TAO_ROOT/docs/ORBEndpoint.html):

 

%TAO_ROOT%/orbsvcs/Naming_Service/Naming_Service -ORBEndpoint iiop://localhost:2809 -m 0

(名字服务在本机的2809端口监听请求,不使用多播方式)

 

若要使用多播方式启动Naming_Service时,只需执行

%TAO_ROOT%/orbsvcs/Naming_Service/Naming_Service -m 1

三、参数配置

启动完成后,Naming Service就默默在那里工作了,但是,你的servantclient如何访问它呢?

要在ServerClient程序中访问NameService有两种方法:

1、配置InitRef信息:

可以在启动程序时通过-ORBInitRef来指定,如:

-ORBInitRef NameService=IOR:00ff...

或使用corbaname,如:

-ORBInitRef NameService=corbaname::localhost:2809

指定NameService在本机的默认端口上监听。

也可采用corbaloc来指定NameService的运行信息,如:

-ORBInitRef NameService=corbaloc:iiop:1.2@localhost:2809/NameService

在这里,corbaloc/corbaname被用于以更具有可读性的方式来定位servant,关于corbanamecorbaloc的更为详细的信息见参考6

 

配置好InitRef后,程序中就可以通过:

orb->resolve_initial_references("NameService");

访问到NameService了。

2、访问Naming Service的另一种方式则是传递Naming ServiceIOR串,然后通过:

orb->string_to_object(...);

IOR串连接到相应的Naming Service,因为NameService只不过是一个特殊的servant

四、实例

下面新建一个工程eg2_svr,添加到当前Solution,在该工程中添加一个名为eg2_svr.cpp的文件(由于代码较多,文件内容略,详见附件),使该工程依赖于前面的idl工程。由于这是一个Server程序,并且还要用到命名服务,需要链接以下两个链接库:

TAO_CosNamingd.lib

TAO_PortableServerd.lib

编译该工程。

新建一个eg2_cli工程,添加到当前Solution,在该工程中添加一个名为eg2_cli.cpp的文件(由于代码较多,文件内容略,详见附件),使该工程依赖于前面的idl工程,并在工程链接选项中添加TAO_CosNamingd.lib,以使用命名服务,编译该工程。

Server程序中,我们在创建好servant object后,将其bind到了Naming Service中;在Client程序中,通过resolve助记符,我们从Naming Service那里取得了servantIOR信息,进而便可与相应的servant进行连接。

在这里Naming Service一定程度上扮演了一个DNS的角色,DNS完成了地址到IP的转换,而Naming Service完成的则是助记符到IOR的转换。

 

下面是几组正确的启动Naming Servieeg2_svr/eg2_cli的方法:

%TAO_ROOT%/orbsvcs/Naming_Service/Naming_Service -m 1

eg2_svr

eg2_cli

 

%TAO_ROOT%/orbsvcs/Naming_Service/Naming_Service -m 0 -ORBEndpoint iiop://localhost:2809

eg2_svr -ORBInitRef NameService=iioploc://localhost:2809/NameService

eg2_cli -ORBInitRef NameService=iioploc://localhost:2809/NameService

 

%TAO_ROOT%/orbsvcs/Naming_Service/Naming_Service -m 0 -ORBEndpoint iiop://localhost:2809

eg2_cli -ORBInitRef NameService=corbaname:iiop:1.2@localhost:2809

eg2_svr -ORBInitRef NameService=corbaname::localhost

 

%TAO_ROOT%/orbsvcs/Naming_Service/Naming_Service -m 0 -ORBEndpoint iiop://localhost:2809

eg2_cli -ORBInitRef NameService=corbaloc:iiop:1.2@localhost:2809

eg2_svr -ORBInitRef NameService=corbaloc::localhost

(注:iiop协议标记可以省略,另IANA已将2809端口分配给corbaloc,当服务程序在该端口上监听时可以省略端口号。)

五、其它

%TAO_ROOT%/utils目录下有两个工具:NameViewer/nslist,可用于查看当前Naming_Service中注册的NamingContext的信息,其中NameViewer是一个基于MFC的可视化的工具,如果你使用的是VC2005 Express将无法编译该工程。

此外,该目录下还有一个工具catior可用于查看IOR的详细信息,你可以指定一个存有IOR信息的文件作为输入参数(catior -f file_name)或者在Naming_Service运行过程中,指定一个有效的NamingContext作为参数,如:

catior -n test.my_context/Echo.Object

 

附:本文示例源代码

参考:

1.      Duncan Grisby, Sai-Lai Lo, David Riddoch. The omniORB Version4.0 User's Guide. http://omniorb.sourceforge.net/omni40/omniORB.pdf

2.      OMG. Naming Service Specification, V1.3. http://www.omg.org/cgi-bin/apps/doc?formal/04-10-03.pdf

3.      Carlos O'Ryan. TAO's Naming Service. http://www.cs.wustl.edu/~schmidt/ACE_wrappers/TAO/docs/tutorials/Quoter/Naming_Service/index.html

4.      Object Computing, Inc. TAO FAQ. http://www.theaceorb.com/faq/index.html

5.      Mentoya. TAO使用指南. http://www.huihoo.com/ace_tao/tao_guide.html

6.      Ciaran McHale. The corbaloc and corbaname URLs. http://www.iona.com/devcenter/corba/corbaloc.pdf

你可能感兴趣的:(CORBA与分布式应用)