尝试使用 corbaloc url 连接到 CORBA 服务

Posted

技术标签:

【中文标题】尝试使用 corbaloc url 连接到 CORBA 服务【英文标题】:Attempting to connect to a CORBA Service using corbaloc url 【发布时间】:2010-05-10 07:16:17 【问题描述】:
    String[] orbargs= ;
    org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(orbargs, null);
    org.omg.CORBA.Object cobj = orb.string_to_object("corbaloc:iiop:10.1.1.200:6969/OurServiceHelper");
    _OurServiceHelper cpsh = _OurServiceHelperHelper.narrow(cobj); // Get's stuck
    cpsh.ourMethod();

那个窄就挂了。

我的服务设置为在静态端口上运行。我们知道它有效,因为我们通常通过 NamingService 查找它。

我做错了什么?

【问题讨论】:

我猜这是Java?如果是这样,您可能应该重新标记。我建议发布该进程的线程转储。 我相信问题出在我的 corbaloc 字符串上。在 _OurServiceHelper 中被 _is_a() 方法阻塞。所有这些都是生成的代码。我跟踪了 OpenOrb 代码,但并不真正了解发生了什么。无论如何,作为一个测试,我在服务端生成了 IOR 并使用了它。这行得通。 org.omg.CORBA.Object cobj =orb.string_to_object("IOR:hugestring"); 【参考方案1】:

如果您使用的是 NamingService,您实际上应该使用 corbaname url 而不是 corbaloc url。如果您的命名服务在端口 6969 上,则以下将起作用。如果“OurServiceHelper”在 6969 上但 NamingService 在不同的端口上,您需要在下面的 url 中指定命名服务的端口而不是 6969。服务器对象嵌入在 NamingService 返回的 ior 中,因此不需要指定它。

"corbaname:10.1.1.200:6969#OurServiceHelper"

回复:评论: 首先是关于 IOR 和提供对象的说明。如果您希望您的服务对象在进程重新启动时保持不变,您必须在包含对象的 POA 上设置 PERSISTENTlifetime 策略。此外,IOR 嵌入了服务器的 ip 和端口,因此如果您想生成在重新启动时保持一致的 IOR,您必须使用静态 IP 和端口号以及使用持久生命周期策略。

名称服务让您不必担心很多此类事情,从而使事情变得更容易。只要名称服务在已知位置可访问,您的所有服务器对象都可以在实例化时向名称服务注册自己,然后客户端可以访问它们而无需知道它们的位置。

如果您决定不使用名称服务,您的代码将不得不稍作更改。如果您使用corbalocurl,那么您使用的是互操作命名服务 (INS)。请参阅:http://java.sun.com/j2se/1.4.2/docs/guide/idl/INStutorial.html。使用 INS,您需要使用 NamingContextExt 对象的功能。具体来说,要解析您构建的 corabloc url,您应该调用 NamingContextExt::resolve_strfunction 并传入 url。

【讨论】:

但我不想通过命名或交易。如果我在启动时打印出服务器 IOR,我可以使用它从客户端重新创建引用。但是 IOR 是一个巨大的字符串,如果我们重新启动服务器,它就会发生变化。所以我正在寻找的是一种基于某些 URL 类型字符串连接到我的服务器的方法。如果说命名和交易所在的机器出现故障,我们的其他系统仍然可以与我们的服务器通信,这可能很有用。 所以最后,关于终身政策和其他东西的评论是我们一直以来真正应该做的事情,而我的问题问错了。【参考方案2】:

corbaloc URL 的关键部分(斜杠后的字符串)可能不正确或未正确注册,并且服务器端 orb 无法将密钥映射到对象引用。

你是如何运行服务器的?

这应该可行:

<server> -ORBInitRef OurServiceHelper="file://server.ior"

所以当 corbaloc 请求进入 orb 时,应该能够将密钥与 ior 匹配并返回给您 ior。不同的 ORB 有不同的方法来注册初始引用,例如 TAO 有一个称为 IORTable 的专有接口。

【讨论】:

我们正在运行具有以下 CORBA 属性的服务器 Server -pss -ORBProfile=pss -ORBPort=6969 -ORBInitRef TradingService=corbaloc::1.2@10.1.1.220:2011/TradingService - ORBInitRef NameService=corbaloc::1.2@10.1.1.220:2001/NameService 所以我猜你在告诉我,我应该先将 IOR 写到某个地方。然后在需要时使用它直接连接。【参考方案3】:

corbaloc 中没有类型信息,因此 ORB 正在通过远程调用 (_is_a) 检查您缩小到的类型。尝试使用未检查的窄,它不会调用 _is_a:

_OurServiceHelper cpsh = _OurServiceHelperHelper.narrow(cobj);

_is_a 调用没有为您返回,这很奇怪。我的猜测是 unchecked_narrow 会起作用(你会得到一个非空的结果),但是对象引用不起作用。

【讨论】:

以上是关于尝试使用 corbaloc url 连接到 CORBA 服务的主要内容,如果未能解决你的问题,请参考以下文章

使用 keytab 文件连接到 Impala 的 jdbc URL

PayPal IPN 模拟器:尝试连接到 URL 时出现问题。请检查网址并重试

无法使用 java 连接到 HTTPS url

Java - 通过浏览器/URL 连接到 ServerSocket

BitBucket Webhook - 无法连接到 Jenkins URL

将android连接到mysql数据库的url