2009-05-04 9 views
8

私は現在作業中のプロジェクトにRMIを使用しています。複数のホストから単一のRMIレジストリにバインドしたいと思います。私はそうしようとしたとき単一のRMIレジストリの使用

は、しかし、私は

java.rmi.AccessExceptionを言ってエラーを取得:禁止Registry.Registry.bind。 origin/192.168.0.9は非ローカルホスト

私はそうしていましたが、RMIはデフォルトでリモートホストをバインドしていないようですが、これを上書きまたはバイパスする方法はありますか?

この問題をどのように解決するかについてご意見がありましたら、高く評価されますが、私はさまざまなポリシーファイルを使用してセキュリティマネージャを無効にしようとしていますが、

答えて

0

everyonesのためのおかげで、私は最後に、これは配布のために非常に柔軟なシステムを提供しますCajo Frameworkを使用していた中で思い付いたソリューションを答えると私はフィット見たように私には、レジストリを処理することができました。また、NAT、ファイアウォール、およびHTTPプロキシの背後で動作することもでき、非常に便利です。

私は、rndm.buoyによって提案されたプロキシミングの方法がいくつかのケースではうまくいくと考えていますが、システムによっては面倒かもしれません。RMIは、DebianベースのLinuxディストリビューションで実行しているとき、特にこの問題があった間違ったネットワークインタフェースに関連する問題があるようです。

0

私は間違っているかもしれませんが、rmiregistryアプリケーションは本質的にローカルネーミングサービスのラッパーです。つまり、リモートオブジェクトをポイントする方法はありません。

あなたが必要とするものは、ネーミング実装であり、これでクラスター化されています。 J2EE ASクラスタリング・ソリューションに移行することを検討してください。 JNDIツリーはクラスタ内で共有されます。

+0

間違っています。 RMI Registry *はネーミングサービスです。何よりもラッパーではありません。 localhost以外のbind/rebind/unbind要求は受け付けません。それはリモートオブジェクトを指すことができないということと同じではありません。できる。 – EJP

1

ご質問が誤解されている可能性がありますので、お知らせください。

私はJava RMIでの経験が限られています。私たちは、Design PatternsクラスでProxy Patternを使用しました。

私たちのプロジェクトは、大学のネットワークの外で働くことはできませんでしたが、ネットワークに直接接続しても完全に機能しました(図書:Headfirst Design Patterns)。私たちの教授によると、インターネットやWanでの実装ではRMIを使用することはできませんでした。彼女が提案した解決策は、VPNが必要であるということでした。私はそれがローカルのネーミングサービスでなければならないという点で、Vladimirが正しいと信じています。

+0

いいえ。クライアント側のプロキシを持つネットワーク上ではコールバックが実行不可能であることと、RMI FAQの項目A.1で説明されている問題があります。 「ローカルネーミングサービス」は、想像力の象徴です。 – EJP

7

制限を回避する方法はありますが、それは回避策です。とにかく、試してみてください。それは私たちのために働く。

中央のRMIレジストリを実行しているホストで、1つのリモートメソッドproxyRebindでリモートオブジェクトをバインドする小さなサービスを実行します。このメソッドの実装は、中央レジストリで提供されるオブジェクトを単にバインドします(レジストリはこのサービスと同じマシン上にあるため失敗しません)。

他のすべてのホストは、単にこのリモートオブジェクトを参照し、独自のリモートオブジェクトを使用してproxyRebindを呼び出します。

これは、リモートでホストされているレジストリのルックアップが許可されているために機能します。リモートでホストされているレジストリへのバインドが許可されていないため、元の試行は失敗しました。

これをさらに明確にする必要がある場合はお知らせください。

/RS

+0

それは賢いです! JREの将来のリリースで潜在的なセキュリティーホールとして閉鎖される可能性のあるものと思われます。私は主要な設計上の決定をこのテクニックに依存させることはしません。 –

+0

もしそれが閉じられるなら、ずっと前に起こったでしょう!私はこの実装を過去10年間行っています! – user40552

+0

rndm.buoyこれを実装しようとしましたが、オブジェクトは実際にはsuccesfulyをバインドしますが、リモートメソッドを呼び出そうとすると例外java.rmi.ConnectExceptionが発生します:接続がホストに拒否されました:127.0.1.1;リモートオブジェクトがIP 192.168.126.137 に解決する必要があるにもかかわらず、私が迷っているものがあるかどうか疑問に思っています。あなたの提案を拡大していただければ幸いです。 –

2

2は約 制限を取得する方法がありますが、それはそれが何であるかです: 回避策。とにかく、 を試してみてください。それは私たちのために働く。 proxyRebind: 中央RMIレジストリを実行しているホストで

は一つだけのリモートメソッドを使用して、リモート オブジェクトを結合する小さな サービスを実行します。 このメソッドは、 レジストリ( レジストリはこのサービスと同じマシン上にあるため、これは失敗しません)に登録されているオブジェクト を単純にバインドします(このサービスは と同じマシンにあります)。

他のすべてのホストは、 このリモートオブジェクトを検索し、独自のリモート オブジェクトを使用して proxyRebindを呼び出します。

これは、リモートで のホストされたレジストリのルックアップが許可されているためです。 リモートでホストされているレジストリへのバインド は許可されていません。

さらに詳しい説明が必要な場合はお知らせください。

これは完全に機能します。注意を払う唯一のことは、常に正しく設定する必要があります。 -Djava.rmi.server.hostname = "LOCAL HOST IP"

+0

マルチホームホストで 'java.rmi.server.hostname'を設定するか、RMI FAQの項目A.1(http://docs.oracle.com/)で説明されているようにDNSに問題がある場合にのみ設定してください。 .com/javase/7/docs/technotes/guides/rmi/faq.html#ドメイン)。 – EJP

関連する問題