可以通过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 和对您的对象的引用的网络消息。如果您没有注册您的对象,那么该引用当然在那里不可用,并且服务器工具将向您显示一个空列表,就像您抱怨一样。