2015-10-05 84 views
1

我有一個要求,即RMI客戶端需要獲取遠程RMI註冊表中註冊的所有遠程對象。RMI客戶端如何看到並獲取在註冊表中註冊的所有動態遠程對象?

第一個問題,我知道有一個registry.list()方法返回對象的所有名稱。但是,如何獲得我想要的類型的對象(實現我想要的接口),假定還有其他類型的對象也被註冊。我應該遍歷名稱並使用try/catch語句,嘗試實例化每個遠程對象嗎?

第二個問題,如果一個新的對象被註冊,客戶怎麼會注意到?在我的要求中,服務器將動態註冊到註冊表中的新對象,並且客戶端需要更新並更快訪問新對象。我應該使用一個線程來定期列出所有的名字來找出新的對象嗎?

請注意,遠程對象將從不同節點導出,但不從同一節點導出。我知道它們是否來自同一個節點,可能我可以使用從實例化遠程對象之一調用的回調功能。

回答

3

RMI客戶端如何看到並獲取註冊表中註冊的所有動態遠程對象?

通過調用Naming.list()Registry.list().

我的RMI客戶端需要在遠程RMI註冊表中註冊的所有遠程對象的要求。

參見上文。

如何獲取我想要的類型的對象(實現我想要的接口),假設還有其他類型的對象註冊?我應該遍歷名稱並使用try/catch語句,嘗試實例化每個遠程對象嗎?

只是遍歷由list()返回的名稱;每一個都是lookup();並使用instanceof來確定它是否是您需要的類型。如果註冊管理機構包含存根(stub),則您沒有爲客戶提供所有必需的課程,您需要注意ClassNotFoundException。通過JNDI listBindings()方法以較少的步驟完成所有這些操作的簡單方法。

第二個問題,如何可以在客戶端獲取如果一個新的對象被註冊注意到了嗎?

它不能。沒有爲RMI註冊表定義監聽器系統。客戶將不得不進行民意調查。

在我的要求中,服務器將動態註冊到註冊表中的新對象,並且客戶端需要更新並更快地訪問新對象。我應該使用一個線程來定期列出所有的名字來找出新的對象嗎?

是的。

請注意,遠程對象是從不同的節點出口,但不能從同一個節點。

您會發現難以安排,因爲您只能撥打bind()和來自與註冊表相同主機的朋友。您必須組織一些中間遠程對象來爲每個非本地節點進行註冊。

我知道它們是否來自同一個節點,可能我可以使用從其中一個實例化遠程對象調用的回調功能。

來自同一個節點並不是一個先決條件。您可以在任何防火牆不阻礙的拓撲中執行RMI回調。

+0

謝謝你的明確答案。它有助於! –

+0

沒有'ClassCastExceptions'的更簡單的方法是通過'javax.naming.Context.list()'方法,它返回一對枚舉類型'{name,class-name},而不需要檢索對象。 – EJP

+0

當我試圖查看javax.naming的用法時,發現了以下接口:javax.naming.event.NamingListener。從描述看來,它可以用於收聽命名更改事件,如添加名稱等。這是否適用於我的要求? –