有没有办法从正在运行的 Java (1.5) 程序访问 corba 名称服务。 我想查看哪些其他进程注册到给定进程。
我确实知道 JRE 中有三个工具。 servertool
、orbd
和 tnameserv
,但要么我没有正确使用它们,要么它们不是正确的工具。
附加信息:
该程序以 -ORBInitialPort 1234
执行orbd -ORBInitialPort 1234
-> 由于已在使用而返回错误(是的,因为应用程序正在运行)与tnameserv
相同。
但如果我使用servertool -ORBInitialPort 1234
,则不会发生错误。但是,如果我在命令提示符或其他命令中键入“list”,它将始终返回一个空列表。
真诚的 克里斯蒂安
最佳答案
可以通过 org.omg.CosNaming 中的类访问现有的、正在运行的 CORBA 命名服务。包裹。您需要获取NamingContextExt
。它具有迭代所有现有绑定(bind)以及按名称解析对象的方法。
当您启动 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.
}
参见here有关如何访问 CORBA 对象的教程和 here关于如何使用命名服务。
默认情况下(如果未配置)orb.resolve_initial_references("NameService")
返回正在运行的虚拟机上的本地服务,您需要查询外部服务。要使用此功能,您需要传递正确的配置属性(在我的示例中第二个参数为 null),并将 ORBInitRef.NameService 属性设置为您的名称服务的地址,如 here 中所述。 。许多(或大多数)生产环境都设置了此属性,以便此方法返回正确的远程名称服务。
servertool是一个命令行工具,允许列出已注册的 CORBA 对象,而无需编写 Java 代码。您需要指定感兴趣的名称服务在哪个主机上运行。如果服务在给定的主机和端口上运行,servertool 不会提示。如果找不到,它应该提示!
最重要的是,您的 CORBA 对象必须通过调用注册到获得的名称服务
nameService.bind(yourName, yourCORBAObject);
如果名称服务是远程的,这将发送包含您的 orb 的 URL 和对您的对象的引用的网络消息。如果您没有注册您的对象,当然该引用将不可用,并且服务器工具将向您显示一个空列表,就像您提示的那样。
关于java - 访问 Java Corba 名称服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14279987/