如何获得 CORBA IOR

Posted

技术标签:

【中文标题】如何获得 CORBA IOR【英文标题】:How to obtain a CORBA IOR 【发布时间】:2013-05-29 18:44:08 【问题描述】:

我正在使用 CORBA network management spec 工作,我想获取包含连接到 CORBA 服务所需信息的 IOR 文件。有一些关于如何从我发布的链接中获取“ExternalNameService.ior”文件的信息,但我不知道该怎么做。基本上我知道我想做的是:

    获取 IOR。 对其进行解码,以便我获得 CORBA 服务的 IP 和端口。 编译 IDL 并使用它们连接到远程资源。

我坚持的部分是获取 IOR。有什么想法吗?

编辑

我正在尝试提供我自己的探针实现...不使用 IBM 的。文章简单显示了命名服务的名称,由于某种原因我无法连接......这是我最大的问题。如果我尝试连接到本地名称服务,则以下代码有效,但对于爱立信则失败。我提供了正确的 ORBInitialPortORBInitialHost 作为命令行参数。

  ORB orb = ORB.init(args, null);
  String corbalocURL = "ExternalNameService";
  // get the root naming context
  org.omg.CORBA.Object objRef = orb.resolve_initial_references(corbalocURL);
  // Use NamingContextExt instead of NamingContext. This is
  // part of the Interoperable naming Service.
  System.out.println(objRef);
  NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
  System.out.println(ncRef);

这些是我遇到的错误:

ERROR : org.omg.CORBA.OBJECT_NOT_EXIST:   vmcid: 0x0  minor code: 0  completed: No
org.omg.CORBA.OBJECT_NOT_EXIST:   vmcid: 0x0  minor code: 0  completed: No
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
    at java.lang.Class.newInstance0(Class.java:374)
    at java.lang.Class.newInstance(Class.java:327)
    at com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase.getSystemException(MessageBase.java:914)
    at com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage_1_0.getSystemException(ReplyMessage_1_0.java:111)
    at com.sun.corba.se.impl.protocol.CorbaMessageMediatorImpl.getSystemExceptionReply(CorbaMessageMediatorImpl.java:590)
    at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.processResponse(CorbaClientRequestDispatcherImpl.java:459)
    at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.marshalingComplete(CorbaClientRequestDispatcherImpl.java:355)
    at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:147)
    at com.sun.corba.se.impl.resolver.BootstrapResolverImpl.invoke(BootstrapResolverImpl.java:114)
    at com.sun.corba.se.impl.resolver.BootstrapResolverImpl.list(BootstrapResolverImpl.java:151)
    at com.sun.corba.se.impl.resolver.CompositeResolverImpl.list(CompositeResolverImpl.java:55)
    at com.sun.corba.se.impl.resolver.CompositeResolverImpl.list(CompositeResolverImpl.java:55)
    at com.sun.corba.se.impl.resolver.CompositeResolverImpl.list(CompositeResolverImpl.java:55)
    at com.sun.corba.se.impl.orb.ORBImpl.list_initial_services(ORBImpl.java:1143)
    at HelloClient.main(HelloClient.java:22)

【问题讨论】:

你成功拿到 IOR 了吗?我的意思是 com.sun.corba.se.spi.ior.IOR 对象。另一个 E/// 家伙(ealnmar)。 AFAIK 也无法通过 RSG 进行 Corba。 【参考方案1】:

你不应该做#2。 CORBA 旨在向您隐藏网络详细信息。此外,IOR 并不总是绑定到 TCP/IP,因此甚至可能不包含主机或端口(尽管它们几乎总是如此)。

我建议在进一步了解 CORBA 之前再多学习一点。 This 是一个很好的介绍网站。

IOR 是服务器对象的“句柄”,是不透明的数据块,仅用于调用它们所引用的远程资源。它们就像人们的电话号码 - 一种实现交流的手段。

如果您在某处的文件中没有 IOR 字符串,您可能能够在某处运行的命名服务中找到 IOR(它就像 IOR 的“白页”目录)。

【讨论】:

看起来您不需要自己为链接到的“探针”实现执行此操作 - 文档指出您只需要设置一个指向 NameService 的属性或为 IOR 提供服务的 URL @GreyBeardedGeek 请阅读我的更新,如果您需要更多信息,请告诉我......感谢您的帮助 好吧,老实说,我几乎很抱歉我跳到这里 - 自从我对 CORBA 做任何事情以来已经有好几年了,而且我显然已经超出了我的深度。但是,您的命名服务器显然存在问题 - 我可以建议将“CORBA.OBJECT_NOT_EXIST”插入您最喜欢的搜索引擎吗? 感谢您的反馈。当我想出解决方案时,我会回信...以防有人感兴趣

以上是关于如何获得 CORBA IOR的主要内容,如果未能解决你的问题,请参考以下文章

CORBA - JacORB:使用固定端口生成 IOR?

Corba IOR 解码

CORBA.MARSHAL:无法从底层网桥读取值:初始和转发的 IOR 不可访问 vmcid

org.omg.CORBA.TRANSIENT:初始和转发的 IOR 不可访问 - 应用程序之间

CORBA 客户端有没有办法访问服务器 IOR 文件?

CORBA.TRANSIENT 的考虑事项:初始和转发的 IOR 不可访问 vmcid:IBM 次要代码:E07 错误