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

Java 尝试使用corbaloc url连接到CORBA服务,java,corba,openorb,Java,Corba,Openorb,那条窄路就这么悬着 我的服务设置为在静态端口上运行。我们知道它是有效的,因为我们通常通过NamingService查找它 我做错了什么?如果您使用的是NamingService,那么实际上应该使用corbaname url而不是corbaloc url。如果您的命名服务位于端口6969上,则以下选项将起作用。如果“OurServiceHelper”位于6969上,但NamingService位于其他端口上,则需要在下面的url中指定命名服务的端口,而不是6969。服务器对象的端口嵌入到Namin

那条窄路就这么悬着

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


我做错了什么?

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

    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();
回复:评论: 首先是关于IOR和服务对象的说明。如果希望服务对象在进程重启期间保持持久性,则必须在包含对象的POA上设置
持久性
生存期策略。此外,IOR嵌入了服务器的ip和端口,因此,如果要生成在重启期间保持一致的IOR,则必须使用静态ip和端口号以及持久生存期策略

名称服务使事情变得更容易,因为它允许您不必担心这些事情。只要可以在已知位置访问名称服务,所有服务器对象都可以在实例化时向名称服务注册,然后客户端就可以访问它们,而无需知道它们的位置


如果您决定不使用名称服务,您的代码将不得不有所更改。如果您使用的是
corbaloc
url,那么您使用的是可互操作的命名服务(INS)。请参阅:。使用INS,您需要使用
NamingContextExt
对象的功能。具体来说,要解析您构建的corabloc url,您应该调用
NamingContextText::resolve_str
函数并传入url。

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

你是如何运行服务器的

这应该起作用:

"corbaname:10.1.1.200:6969#OurServiceHelper"
-ORBInitRef-ourserviceheloper=”file://server.ior"

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

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

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

奇怪的是,你的电话没有回。我的猜测是,unchecked_狭窄将工作(您将得到一个非空结果),但对象引用将不工作。

我猜这是Java?如果是这样,您可能应该重新标记。我建议发布进程的线程转储。我相信问题在于我的corbaloc字符串。在_中,我们的ServiceHelper在_is_a()方法中被阻塞。所有这些都是生成的代码。我通过OpenOrb代码进行了跟踪,但并不真正理解发生了什么。无论如何,作为测试,我在服务端生成IOR并使用它。这很有效。org.omg.CORBA.Object cobj=orb.string_to_Object(“IOR:hugestring”);但我不想经历命名或交易。如果我在启动服务器时打印出服务器IOR,我可以使用它从客户端重新创建引用。但是IOR是一个巨大的字符串,如果我们重新启动服务器,它会发生变化。因此,我正在寻找一种基于URL类型字符串连接到服务器的方法。如果命名和交易的机器坏了,我们的其他系统仍然可以与我们的服务器通信,那么这可能会很有用。所以最后,关于生存期策略和其他东西的评论是我们一直以来都应该做的,我的问题问错了。我们使用以下CORBA属性服务器运行服务器-pss-ORBProfile=pss-ORBPort=6969-ORBInitRef TradingService=corbaloc::1。2@10.1.1.220:2011/TradingService-ORBInitRefNameService=corbaloc::1。2@10.1.1.220:2001/NameService所以我想你是在告诉我,我应该先写下某个地方的IOR。然后在我需要的时候用它直接连接。
_OurServiceHelper cpsh = _OurServiceHelperHelper.narrow(cobj);