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查找它。
我做错了什么?
答案 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结果),但是对象引用将不起作用。