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

时间:2010-05-10 07:16:18

标签: java corba openorb

    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查找它。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

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

"corbaname:10.1.1.200:6969#OurServiceHelper"

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

名称服务让您不必担心很多这些东西,从而使事情变得更容易。只要名称服务在某个已知位置可以访问,所有服务器对象只需在实例化时就可以使用名称服务进行注册,然后客户端就可以访问它们而无需知道它们的位置。

如果您决定不使用名称服务,则代码必须稍微改变。如果您使用corbaloc网址,那么您正在使用互操作命名服务(INS)。见:http://java.sun.com/j2se/1.4.2/docs/guide/idl/INStutorial.html。使用INS,您需要使用NamingContextExt对象的功能。具体来说,要解析您构建的corabloc网址,您应该调用NamingContextExt::resolve_str函数并传入网址。

答案 1 :(得分:0)

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

你是如何运行服务器的?

这应该有效:

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

因此,当corbaloc请求进入orb应该能够匹配ior的关键并返回你的ior。不同的ORB有不同的方式来注册初始引用,TAO有一个名为IORTable的专有接口。

答案 2 :(得分:0)

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

_OurServiceHelper cpsh = _OurServiceHelperHelper.narrow(cobj);

很奇怪,_is_a电话不会为你返回。我的猜测是unchecked_narrow将起作用(你将获得一个非null结果),但是对象引用将不起作用。