2

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

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

附加信息:程序开始于-ORBInitialPort 1234

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

真诚的基督徒

4

1 回答 1

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 对象的教程和有关如何使用命名服务的教程,参见此处

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

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

最重要的是,您的 CORBA 对象必须通过调用来向获得的名称服务注册

nameService.bind(yourName, yourCORBAObject);

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

于 2013-01-11T15:29:02.310 回答