2014-01-13 69 views
0

打電話給我瘋了,但我正在嘗試爲舊的CORBA客戶端編寫單元測試。爲了模擬服務器,我啓動了一個ORB守護進程和一個虛擬ORB服務器(在不同的線程中)。客戶端配置了一個名稱服務URL。原來,該服務獲取這樣的:如何使ORB服務器返回IOR而不是GIOP消息?

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

getIOR函數有什麼作用?那是什麼'str'是'string_to_object'的參數? –

+0

您的CORBA客戶端需要一個真正的IOR,因此您的虛擬服務器必須向客戶端提供真正的IOR。這可以通過創建一個真正的CORBA服務器來測試你的客戶端來完成,你不能僅僅創建一個文本字符串並且假定一個現有的CORBA客戶端來接受它。 –

+0

'getIOR'從URL中讀取字節,直到遇到'\ n'(第一行)並從它們創建一個字符串。 'str'應該是'ior',我的不好,固定在問題上。 – zaza

回答

0

我想你在這裏有一些誤解。一個IOR是一個參考到一個CORBA對象,而GIOP消息是當你要求一個ORB在它所承載的CORBA對象上執行一些操作時得到的。

在第一個片段,您可以使用localhost:1050這是任何CORBA對象的引用(也許只是其中的ORB等待請求其ojects)。第二個片段的工作原理應該是因爲您使用的是返回對CORBA對象的引用的本機初始引用解析。在獲得對命名上下文的引用後,可以使用object_to_string來獲取IOR(引用的字符串表示形式)。

+0

我承認我是一個noob,但如果我理解正確,舊客戶端(第一個片段)通過從提供的URL中讀取它(IOR)來獲取對命名服務的引用。由於我無法更改客戶端代碼(第二個代碼片段只是快速嘗試),我認爲在設置服務器時有一些錯誤。 – zaza

+1

相信我,我用CORBA度過了我生命的一半,我還沒有看到像第一段代碼那樣的任何代碼。我的猜測是,在那個端口上,服務器放置一個基本的TCP服務器來輸出IOR,但這完全在CORBA之外,並且與承載CORBA對象的服務器的實現有關(也許該服務在給定的端口上每個請求返回IOR)。 –

+0

我想你已經指出了它,我能夠看到一個URL的例子,它看起來像這個'http:// example.com/nameservice.ior',它看起來像一個純文本文件,命名服務。謝謝你的提示! – zaza

相關問題