叫我疯了,但我正在尝试为传统的CORBA客户端编写单元测试。为了模拟服务器,我正在启动一个ORB守护进程和一个虚拟ORB服务器(在不同的线程中)。客户端配置了名称服务URL。最初,服务的检索方式如下:
String url = "localhost:1050";
String ior = getIOR(url); // first line (until '\n') returned from the URL
org.omg.CORBA.Object localObject = getORB().string_to_object(ior);
NamingContext namingService = NamingContextHelper.narrow(localObject);
这对我没用,所以我不得不改为:
Properties props = new Properties();
props.put("org.omg.CORBA.ORBInitialHost", "localhost");
props.put("org.omg.CORBA.ORBInitialPort", "1050");
ORB orb = ORB.init(new String[0], props);
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
NamingContext namingService = NamingContextHelper.narrow(objRef);
差异归结为在工作测试中使用string_to_object
vs resolve_initial_references
。问题是:如何让我的虚拟ORB服务器像客户期望的那样返回IOR(纯文本)?目前,它不是IOR而是以GIOP格式返回消息。我应该翻转服务器上的开关吗?
答案 0 :(得分:0)
我想你在这里有一些误解。 IOR是CORBA对象的引用,而当您要求ORB对其承载的CORBA对象执行某些操作时,会获得GIOP消息。
在第一个代码段中,您使用localhost:1050
NOT 任何CORBA对象的引用(可能就在ORB正在等待对其对象的请求的位置)。第二个片段正常工作,因为您正在使用返回对CORBA对象的引用的本机初始引用解析。在获得对命名上下文的引用后,您可以使用object_to_string
来获取IOR(引用的字符串表示)。