访问Java Corba名称服务

访问Java Corba名称服务,java,corba,nameservice,Java,Corba,Nameservice,是否有任何方法可以从运行的Java(1.5)程序访问corba名称服务。 我想看看还有哪些进程注册到给定的进程 我知道,JRE中有三种工具servertool、orbd和tnameserv但要么我没有正确使用它们,要么它们不是正确的工具 其他信息: 程序通过-orbInitialPort1234 Executeorbd-ORBInitialPort 1234->返回由于已在使用而导致的错误(可以,因为应用程序正在运行),与tnameserv相同。 但是如果我使用servertool-orbIni

是否有任何方法可以从运行的Java(1.5)程序访问corba名称服务。 我想看看还有哪些进程注册到给定的进程

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

其他信息: 程序通过
-orbInitialPort1234

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

诚恳
Christian

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

当您启动
tnameserv
工具时,它会为您打印IOR-这是CORBA URL。如果可以通过网络访问CORBA对象,并且您提供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\u initial\u references(“NameService”)
返回正在运行的虚拟机上的本地服务,您需要查询外部服务。要使用它,您需要传递正确的配置属性(在我的示例中为null的第二个参数),并将ORBInitRef.NameService属性设置为名称服务的地址,如下所述。许多(或大多数)生产环境都设置了此属性,因此此方法返回正确的远程名称服务

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

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

nameService.bind(yourName, yourCORBAObject);

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

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

当您启动
tnameserv
工具时,它会为您打印IOR-这是CORBA URL。如果可以通过网络访问CORBA对象,并且您提供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\u initial\u references(“NameService”)
返回正在运行的虚拟机上的本地服务,您需要查询外部服务。要使用它,您需要传递正确的配置属性(在我的示例中为null的第二个参数),并将ORBInitRef.NameService属性设置为名称服务的地址,如下所述。许多(或大多数)生产环境都设置了此属性,因此此方法返回正确的远程名称服务

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

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

nameService.bind(yourName, yourCORBAObject);

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

访问命名服务的典型方式是通过resolve_initial_references()。当然,为了使resolve_initial_references()能够工作,您必须使用感兴趣的名称服务的IP地址和端口配置您的ORB。例如,在omniORB中,可以将该信息放在配置文件、环境变量中,也可以作为命令行参数。我不使用Java或Java ORB,但我无法想象为什么会有任何不同。是的,您还可以将ORB属性中的ORBInitRef.NameService属性设置为名称服务的位置,然后该服务替换默认的本地服务,以便您可以通过resolve_initial_references()访问它。这包括更多的步骤,但可能应该在生产中使用,我的代码是按照“Hello world”的思路编写的。我现在添加了一些句子来深入挖掘。想知道是谁投了-1票,甚至没有解释这是错误的(关于配置属性的方法现在有点像是写出来的)。也许是一些肥皂剧/WDSL的狂热者。忽略。您对其进行了改进,但您的语句“orb.resolve\u initial\u references(“NameService”)返回正在运行的虚拟机上的本地服务”并不总是正确的。它将返回它配置为返回的任何内容,并且通常是一个远程命名服务。进一步改进了措辞。无论如何,这个名称服务必须配置为正常工作,而我同意它通常是在生产中配置的