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

我究竟做错了什么?

4

3 回答 3

1

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

"corbaname:10.1.1.200:6969#OurServiceHelper"

回复:评论: 首先是关于 IOR 和提供对象的注释。如果您希望您的服务对象在进程重新启动时保持不变,您必须在PERSISTENT包含对象的 POA 上设置生命周期策略。此外,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_str函数并传入 url。

于 2010-05-26T15:59:26.317 回答
0

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

你是如何运行服务器的?

这应该有效:

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

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

于 2010-06-03T14:26:09.267 回答
0

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

_OurServiceHelper cpsh = _OurServiceHelperHelper.narrow(cobj);

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

于 2010-06-20T05:04:27.240 回答