2013-01-11 29 views
2

是否有任何方式從正在運行的Java(1.5)程序中訪問corba nameservice。 我想看看哪個進程被註冊到給定的進程。訪問Java Corba NameService

我知道,JRE中有三個工具。 servertool,orbdtnameserv,但是我沒有正確使用它們,或者它們不是正確的工具。

附加信息: 該計劃開始-ORBInitialPort 1234

執行orbd -ORBInitialPort 1234 - > Returnes由於一個錯誤已經在使用(是罰款,因爲該應用程序正在運行)以相同tnameserv。 但是,如果我使用servertool -ORBInitialPort 1234,則不會發生錯誤。但是,如果我在命令提示符或其他命令中鍵入「list」,它將始終返回一個空列表。

真誠 基督教

回答

4

現有的,運行CORBA命名服務可以通過在org.omg.CosNaming包中的類訪問。您需要獲得NamingContextExt。它有遍歷所有現有綁定以及按名稱解析對象的方法。

當您啓動tnameserv工具,它打印你IOR - 這是CORBA URL。你可以從世界上任何ORB的CORBA對象(名稱服務包括)如果是通過網絡進行訪問,您提供的IOR:

public static void main(String args[]) throws Exception { 
    ORB orb = ORB.init(args, null); 
    // pass the IOR as command line parameter for this program 
    String ior = args[0]; 
    org.omg.CORBA.Object objRef = orb.string_to_object(ior); 
    NamingContextExt nameService = NamingContextExtHelper.narrow(objRef); 

    // Now you can work with your naming service. 
} 

here教程的關於如何訪問CORBA對象和here如何與命名服務一起工作。

默認orb.resolve_initial_references("NameService")(如果未配置)返回正在運行的虛擬機上的本地服務和需要查詢的外部之一。要使用它,你需要傳遞正確的配置屬性(在我的例子中爲空的第二個參數),並將ORBInitRef.NameService屬性設置爲你的名稱服務的地址,如here所述。許多(或大多數)生產環境都具有此屬性集,以便此方法返回正確的遠程名稱服務。

servertool是一個命令行工具,允許列出註冊的CORBA對象,而無需編寫Java代碼。您需要指定感興趣的名稱服務在哪個主機上運行。如果服務在指定的主機和端口上運行,servertool不會投訴。它應該抱怨,如果它沒有找到一個!

最重要的是,你的CORBA對象調用

nameService.bind(yourName, yourCORBAObject); 

如果名稱服務爲遠程與所獲得的名稱服務必須註冊,這將發送包含您的ORB的URL,並參考網絡信息的目的。如果你不註冊你的對象,當然這裏的參考將不可用,並且servertool會向你顯示一個空列表,就像你抱怨一樣。

+0

訪問命名服務的典型方法是通過resolve_initial_references()。當然,您必須使用感興趣的名稱服務的IP地址和端口來配置您的ORB,才能使resolve_initial_references()正常工作。例如,在omniORB中,可以將該信息放在配置文件,環境變量或命令行參數中。我不使用Java或Java ORB,但我無法想象爲什麼它會有任何不同。 –

+0

是的,你也可以在你的ORB的屬性ORBInitRef.NameService屬性設置爲名稱服務的位置,然後該服務將替換默認的本地服務,讓您可以通過訪問的resolve_initial_references它()。這包括更多的步驟,但可能應該用於生產,我的代碼是沿着「你好世界」線。我現在增加了一些句子來深入挖掘。 – h22

+0

不知道誰投了-1這個,甚至沒有解釋這是錯的(關於配置屬性的方式是現在寫的)。也許一些SOAP/WDSL狂熱。忽略。 – h22