访问Java Corba NameService

时间:2013-01-11 14:17:00

标签: java corba nameservice

有没有办法从正在运行的Java(1.5)程序访问corba名称服务。 我想看看哪些其他进程已注册到给定的进程。

我知道,JRE中有三种工具。 servertoolorbdtnameserv,但要么我没有正确使用它们,要么它们不是正确的工具。

其他信息: 该程序以-ORBInitialPort 1234

开头

执行orbd -ORBInitialPort 1234 - >由于已经在使用而返回错误(是的,因为应用程序正在运行)与tnameserv相同。 但是,如果我使用servertool -ORBInitialPort 1234,则不会发生错误。但是如果我在命令提示符或其他命令中键入“list”,它将始终返回一个空列表。

此致 基督教

1 个答案:

答案 0 :(得分:4)

可以通过org.omg.CosNaming包中的类访问现有的,运行的CORBA命名服务。您需要获取NamingContextExt。它具有迭代所有现有绑定以及按名称解析对象的方法。

启动tnameserv工具时,它会为您打印IOR - 这是CORBA URL。如果可以通过网络访问并且您提供IOR,则可以从世界上的任何ORB获取CORBA对象(包括名称服务):

public static void main(String args[]) throws Exception {
   ORB orb = ORB.init(args, null);
   // pass the IOR as command line parameter for this program
   String ior = args[0];
   org.omg.CORBA.Object objRef = orb.string_to_object(ior);
   NamingContextExt nameService = NamingContextExtHelper.narrow(objRef);

   // Now you can work with your naming service. 
}

有关如何访问CORBA对象的教程,请参阅here;有关如何使用命名服务,请参阅here

默认情况下orb.resolve_initial_references("NameService")(如果未配置)返回正在运行的虚拟机上的本地服务,您需要查询外部虚拟机。要使用它,您需要传递正确的配置属性(在我的示例中为null的第二个参数),并将ORBInitRef.NameService属性设置为您的名称服务的地址,如here所述。许多(或大多数)生产环境都设置了此属性,以便此方法返回正确的远程名称服务。

servertool是一个命令行工具,允许列出已注册的CORBA对象而无需编写Java代码。您需要指定正在运行的名称服务的主机。如果服务在给定的主机和端口上运行,servertool不会抱怨。如果找不到,应该抱怨!

最重要的是,您的CORBA对象必须通过调用

注册获取的名称服务
nameService.bind(yourName, yourCORBAObject);

如果名称服务是远程的,这将发送包含您的orb的URL的网络消息和对象的引用。如果你没有注册你的对象,当然那里的引用将不可用,并且servertool会向你显示一个空列表,就像你抱怨一样。