1

RMI クライアントが、リモート RMI レジストリに登録されているすべてのリモート オブジェクトを取得する必要があるという要件があります。

最初の質問です。オブジェクトのすべての名前を返す registry.list() のメソッドがあることは知っています。ただし、他の種類のオブジェクトも登録されていると仮定して、必要なタイプのオブジェクトを正確に取得するにはどうすればよいですか (必要なインターフェイスを実装します)。名前を調べて、try/catch ステートメントを使用し、各リモート オブジェクトのインスタンス化を試みますか?

2 番目の質問です。新しいオブジェクトが登録された場合、クライアントはどのように通知されますか? 私の要件では、サーバーは新しいオブジェクトをレジストリに動的に登録し、クライアントは更新して新しいオブジェクトにすばやくアクセスする必要があります。スレッドを使用して定期的にすべての名前をリストし、新しいオブジェクトを見つけますか?

リモート オブジェクトは、同じノードからではなく、異なるノードからエクスポートされることに注意してください。それらが同じノードからのものであるかどうかはわかっています。おそらく、インスタンス化されたリモート オブジェクトの 1 つから呼び出されるコールバック機能を使用できます。

4

1 に答える 1

4

RMI クライアントは、レジストリに登録されているすべての動的リモート オブジェクトをどのように認識して取得できますか?

電話Naming.list()するか、Registry.list().

RMI クライアントが、リモート RMI レジストリに登録されているすべてのリモート オブジェクトを取得する必要があるという要件があります。

上記を参照。

他の種類のオブジェクトも登録されていると仮定して、必要なタイプのオブジェクトを正確に取得するにはどうすればよいですか (必要なインターフェイスを実装します)。名前を調べて、try/catch ステートメントを使用し、各リモート オブジェクトのインスタンス化を試みますか?

によって返された名前をトラバースするだけlist()です。lookup()各自; instanceof必要なタイプかどうかを判断するために使用します。レジストリに、クライアントで必要なすべてのクラスがないスタブが含まれている場合は、キャッチする必要がありますClassNotFoundException。これらすべてをより少ないステップで簡単に行う方法は、JNDIlistBindings()メソッドを使用することです。

2 番目の質問です。新しいオブジェクトが登録された場合、クライアントはどのように通知されますか?

できません。RMI レジストリに定義されたリスナー システムはありません。クライアントはポーリングする必要があります。

私の要件では、サーバーは新しいオブジェクトをレジストリに動的に登録し、クライアントは更新して新しいオブジェクトにすばやくアクセスする必要があります。スレッドを使用して定期的にすべての名前をリストし、新しいオブジェクトを見つけますか?

はい。

リモート オブジェクトは、同じノードからではなく、異なるノードからエクスポートされることに注意してください。

bind()レジストリと同じホストからしか電話や友達を呼ぶことができないため、手配が難しいことに気付くでしょう. 各非ローカル ノードの登録を行うには、いくつかの中間リモート オブジェクトを編成する必要があります。

それらが同じノードからのものであるかどうかはわかっています。おそらく、インスタンス化されたリモート オブジェクトの 1 つから呼び出されるコールバック機能を使用できます。

同じノードからであることは、その前提条件ではありません。ファイアウォールが邪魔にならない任意のトポロジで RMI コールバックを実行できます。

于 2015-10-05T02:56:07.220 に答える