尝试使用 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 上设置 PERSISTENT
lifetime 策略。此外,IOR 嵌入了服务器的 ip 和端口,因此如果您想生成在重新启动时保持一致的 IOR,您必须使用静态 IP 和端口号以及使用持久生命周期策略。
名称服务让您不必担心很多此类事情,从而使事情变得更容易。只要名称服务在已知位置可访问,您的所有服务器对象都可以在实例化时向名称服务注册自己,然后客户端可以访问它们而无需知道它们的位置。
如果您决定不使用名称服务,您的代码将不得不稍作更改。如果您使用corbaloc
url,那么您使用的是互操作命名服务 (INS)。请参阅:http://java.sun.com/j2se/1.4.2/docs/guide/idl/INStutorial.html。使用 INS,您需要使用 NamingContextExt
对象的功能。具体来说,要解析您构建的 corabloc url,您应该调用 NamingContextExt::resolve_str
function 并传入 url。
【讨论】:
但我不想通过命名或交易。如果我在启动时打印出服务器 IOR,我可以使用它从客户端重新创建引用。但是 IOR 是一个巨大的字符串,如果我们重新启动服务器,它就会发生变化。所以我正在寻找的是一种基于某些 URL 类型字符串连接到我的服务器的方法。如果说命名和交易所在的机器出现故障,我们的其他系统仍然可以与我们的服务器通信,这可能很有用。 所以最后,关于终身政策和其他东西的评论是我们一直以来真正应该做的事情,而我的问题问错了。【参考方案2】:corbaloc URL 的关键部分(斜杠后的字符串)可能不正确或未正确注册,并且服务器端 orb 无法将密钥映射到对象引用。
你是如何运行服务器的?
这应该可行:
<server> -ORBInitRef OurServiceHelper="file://server.ior"
所以当 corbaloc 请求进入 orb 时,应该能够将密钥与 ior 匹配并返回给您 ior。不同的 ORB 有不同的方法来注册初始引用,例如 TAO 有一个称为 IORTable 的专有接口。
【讨论】:
我们正在运行具有以下 CORBA 属性的服务器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 - 通过浏览器/URL 连接到 ServerSocket