私は内部RMIチュートリアルの練習をしています.Sym RMIチュートリアルを見てから、種類のは何が起こっているのかを理解しています。私には奇妙に思えるいくつかのことがあり、実際に何が起こっているのかを知りたいときは、チュートリアルのフィードバックを送ってください。RMIレジストリの有効期間、GCなど
チュートリアルでは、私は、次のコンポーネントを記述しています
- インタフェースは、我々はへのリモートアクセスをしたい方法で、RemoteInterfaceの機能と言います。
- が
UnicastRemoteObject.exportObject(this, PORTNO)
を呼び出し、その結果をキャストすることによってLocateRegistry.createRegistry(PORTNO)
- を呼び出すことにより、スタブRemoteInterfaceのオブジェクトをレジストリオブジェクトを作成し、作成します:
- クラスは、そのコンストラクタであること、RemoteInterfaceの機能の実装、のRemoteServerを言います。
registry.rebind(BINDNAME, stub)
- が
- クラスでレジストリにスタブを結合するだけのRemoteServerのインスタンスを作成し、メインメソッドを持つSERVERDEMOは、言います。
- BINDNAMEを使用してサーバーを呼び出すクライアントクラス。すべて正常に動作します。
- サーバが主な方法が行われた後に実行されているに運ぶ:
まず、私は気づい。私はそれを明示的に終わらせなければならない。私の目では、オブジェクトを作成して終了するだけですが、プログラムは終了せず、クライアントは引き続き接続できます。
- RemoteServerコンストラクタで
registry.unbind(BINDNAME)
を呼び出すと、クライアントは動作を停止しますが、サーバーはまだ終了しません。 - RemoteServerコンストラクタで
UnicastRemoteObject.unexportObject(this, true);
を呼び出すと、サーバーはすぐに終了します。
私は、これがが起こっている理由を知りたいのですが - それがなかった場合、それだけですぐに終了させるように、サーバは役に立たないだろうが。 (私のフィードバックでは、何らかの理由で実行中のサーバに依存することなく、コンストラクタ内のすべてのバインディングを呼び出すのではなく、RemoteServerのバインドとアンバインドのメソッドを呼び出して、ServerDemoの呼び出しを呼び出すことを提案します。それが起こる理由を理解したいとdは。)
第二に、私はLocateRegistry.createRegistry(PORTNO)
を呼び出す前UnicastRemoteObject.exportObject(this, PORTNO)
を呼び出すことができ、すべてがまだ動作していることに気づきました。レジストリを輸出する前にレジストリを設定しなければならないと思っていたが、明らかにそれは思った通りに機能しない。
exportObjectが実際にどのように動作するかについて少しお伝えしたいと思います。(これは前の点と結びついています - なぜオブジェクトをexprtedさせるとプログラムが終了しないのですか)
また、1つの方法でスタブをエクスポートしてバインドして、別の方法でアンエクスポートしてアンバインドする準備ができました方法、私は私は明示的にスタブへの参照を維持する必要があるかどうかを知りたいの間に。 (バインドを解除するには、BINDNAMEのみが必要です。)私の同僚の一人がGCの問題を報告しました。私は気づいていませんが、実際に何が起こっているのか分からないので、私はそれらを排除できません。
レジストリはクライアントで使用されます。レジストリは 'LocateRegistry.getRegistry(HOSTNAME、PORTNO)'を呼び出し、そのレジストリを使用してエクスポートされたオブジェクトを検索します。しかし、私は 'UnicastRemoteObject.exportObject'呼び出しをせずにスタブの代わりにRemoteServerオブジェクトをバインドすることができ、サーバではなくクライアント上でいくつかの' System.out'出力を除いてすべてが動作することに気付きました。さらに混乱している:/ – Rawling