2009-05-04 71 views
8

我一直在使用RMI作爲我目前正在使用的一個項目,我想從多個主機綁定到單個RMI註冊表。使用單個RMI註冊表

然而,當我試圖這樣做,我得到一個錯誤說

java.rmi.AccessException:Registry.Registry.bind不允許的;原產地/ 192.168.0.9是非本地主機

我這樣做谷歌搜索,似乎RMI停止默認綁定遠程主機,我想知道有什麼方法覆蓋或繞過這?

如果任何人對如何讓過去這個問題,他們將高度讚賞任何建議,我已經使用不同的策略文件並覆蓋安全管理器嘗試,但似乎沒有工作。

回答

0

感謝大家的回答,我想出了到底是使用Cajo Framework這給出了一個非常靈活的系統分配的解決方案,它允許我來處理註冊表,我認爲合適的。它也可以在NAT,防火牆和HTTP代理之後工作,這非常有用。

我認爲,代理由rndm.buoy建議的方法會在某些情況下工作,但它可能會出現一些系統上的麻煩。RMI似乎有一些與錯誤的網絡接口關聯的問題我在運行基於Debian的Linux發行版時尤其遇到了這個問題。

0

我可能是錯的,但它看起來像rmiregistry的應用基本上是在本地命名服務的包裝。這意味着沒有辦法使它指向遠程對象。

你需要的是一個命名實現,並聚集在此處。考慮轉入J2EE AS集羣解決方案。 JNDI樹在集羣內共享。

+0

你錯了。 RMI Registry *是一個命名服務。它不是任何東西的包裝。它不會接受來自本地主機以外的綁定/重新綁定/解除綁定請求。這與不能指向遠程對象是不一樣的。它可以。 – EJP 2013-04-04 23:01:45

1

我可能會誤解你的問題,如果有的話請讓我知道。

我對Java RMI的經驗有限,我們在使用代理模式的Design Patterns類中使用它。 (教材:倒栽蔥設計模式)

我們不能讓我們的項目從大學網絡之外的工作,而是直接連接到網絡時,他們完美地工作。根據我們的教授的說法,我們不可能在互聯網或雲上使用RMI。她建議的解決方案是需要VPN。我相信弗拉基米爾是正確的,因爲它與當地的命名服務有關。

+0

不可以。它與客戶端代理網絡上的回調不可行,以及RMI常見問題的A.1中描述的問題有關。 「本地命名服務」是想象力的一種表現。 – EJP 2013-04-05 00:22:01

7

有一種方法可以解決這個限制,但它是這樣的:解決方法。無論如何,請隨時嘗試一下。它適合我們。

在運行中央RMI註冊表中的主機上運行小服務將結合只有一個遠程方法的遠程對象:proxyRebind。此方法的實現只是將提供給它的對象綁定到中央註冊表中(因爲註冊表與此服務在同一臺計算機上,所以這不會失敗)。

所有其他主機將簡單地查找該遠程對象,並用自己的遠程對象調用proxyRebind。

這是可行的,因爲允許在遠程託管註冊表上查找。您的原始嘗試失敗,因爲不允許在遠程託管註冊表上進行綁定。

讓我知道你是否需要更進一步的澄清。

/RS

+0

這很聰明!聽起來像是在JRE未來版本中可能被封閉的潛在安全漏洞。我不會根據這種技術做出任何重大設計決定。 – 2009-05-20 06:21:57

+0

如果它被關閉了,很久以前會發生!過去10年來我一直在做這個實施! – user40552 2009-05-21 14:26:06

2

2有一種方法來解決 的限制,但它是它是什麼:一個 變通。無論如何,請隨時嘗試 它。它適合我們。

在運行的 中央RMI註冊表中的主機上運行小服務 將遠程 對象綁定只用一個遠程方法: proxyRebind。 的實施此方法只是簡單地綁定在中央 註冊表中提供給它的對象 (因爲 註冊表與此服務位於同一臺計算機上,因此 與 此服務不同)。

所有其他主機只需查找此遠程對象 並調用 proxyRebind與自己的遠程 對象。

這是可行的,因爲允許在遠程 託管註冊表中查找。您的 原始嘗試失敗,因爲 不允許在遠程託管註冊表 上綁定 。

讓我知道你是否需要任何進一步的 清晰度。

這完美的作品。唯一要注意的事情是,應始終正確設置。 -Djava.rmi.server.hostname =「本地主機IP」