有没有办法从正在运行的Java (1.5)程序访问corba名称服务。我想看看哪些其他进程注册到了一个给定的进程。
我确实知道,JRE中有三个工具。servertool、orbd和tnameserv,但要么我没有正确使用它们,要么它们不是正确的工具。
附加信息:该程序是通过-ORBInitialPort 1234启动的
与tnameserv相同,Execute orbd -ORBInitialPort 1234 ->返回一个错误,原因是已经在使用中(是的,很好,因为应用程序正在运行)。但是如果我使用servertool -ORBInitialPort 1234,就不会出现错误。但是如果我在命令提示符或其他命令中输入" list“,它将总是返回一个空列表。
诚心的基督徒
发布于 2013-01-11 23:29:02
可以通过org.omg.CosNaming包中的类访问现有的、正在运行的CORBA命名服务。您需要获取NamingContextExt。它具有遍历所有现有绑定以及按名称解析对象的方法。
当您启动tnameserv工具时,它会为您打印IOR -这是CORBA URL。您可以从世界上任何ORB获取CORBA对象(包括名称服务),前提是它可以通过网络访问,并且您提供了IOR:
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是一个命令行工具,它允许在不编写Java代码的情况下列出已注册的CORBA对象。您需要指定在哪台主机上运行感兴趣的名称服务。如果服务在给定的主机和端口上运行,则servertool不会报错。如果找不到,它应该会抱怨!
最重要的是,您的CORBA对象必须通过调用
nameService.bind(yourName, yourCORBAObject);如果名称服务是远程的,这将发送包含您的orb的URL和对您的对象的引用的网络消息。如果你没有注册你的对象,当然引用将不可用,servertool会给你一个空的列表,就像你抱怨的那样。
https://stackoverflow.com/questions/14279987
复制相似问题