2016-08-31 14 views
0

Java RMIを使用して分散アプリケーションを構築しています。Java RMIクライアントの損失接続

エージェントがサーバーに登録するときはいつでも、サーバーは計算を実行します(たとえば、エージェントを配列に追加します)。そしてエージェントはサーバーに活気のあるメッセージを送り続けます。

私はいつでもエージェントの停止は、このメッセージを送信したり、接続が失われるということで、サーバー通知いると再計算(例えば、リストからクライアントを削除します)

これを行うための最善の方法は何ですか?

クライアントにpingを実行する方法や、マルチスレッドを使用する方法がありました。アドバイスをいただきありがとうございます

答えて

0

サーバが各クライアントに固有のリモートオブジェクト(たとえば、リモートセッションなど)を発行して、Unreferencedを実装し、unreferenced()メソッド実装で必要なロジックを実装させるようにしてください。

NB実際には、RMIに「接続が失われる」というようなことはありません。その根底にある接続は、接続プーリングの対象となり、APIレベルでは接続はまったくありません。

+0

ありがとうございました。これで各オブジェクトの 'unrefrenced()'がサーバに通知されるようになりました。どうやってやるの? –

+0

Eh?これは、クライアントがなくなると自動的にサーバーで実行されます。 Javadocを読んでください。 – EJP

0

これにはいくつかの方法があり、それぞれに利点と欠点が関連付けられています。

1)双方向ライフライン

このソリューションでは、サーバーとクライアントの両方の効果永遠にブロックlifeline()メソッドを持っているでしょう。接続が切断された場合、このメソッド呼び出しですぐにRemoteExceptionがスローされます。クライアントが呼び出しを開始した場合、クライアントはサーバーに再接続を試みるか、終了することができます。サーバは、クライアントが接続を切断した場合(サーバがclient.lifeline()を呼び出すときに例外によって検出された場合)、クライアントによって呼び出されたserver.lifeline()が返すようなロジックを維持する必要があります。そうしないと、サーバーのメモリが不足するまで

利点:接続が切断されるとすぐに通知されます。

欠点:接続ごとにサーバーとクライアント上の新しいスレッドを維持し、より複雑な切断ロジックを維持する必要があります。

2)ハートビートこの場合

、上に接続されたクライアントごとに数秒ごとに、あなたはまだserver.ping()数秒ごとに呼び出して、各クライアント上で一つのスレッドを持っていますが、あなただけのclient.ping()を呼び出してサーバー上の1つのスレッドを必要とします平均。 ping()呼び出しで例外が発生した場合は、切断されていることがわかります。

利点:よりシンプルな接続ロジック、接続状態を管理する少数のスレッドによるサーバー上で消費少ない資源。

欠点:ping()コールの失敗時にTCP応答が遅くなり、応答時間が遅くなります(ping呼び出し間の遅延まで)。

だから最善のルートは何ですか?

私はこれがあなたのアプリがやろうとしていることに完全に依存していると思います。できるだけ早くネットワークの状態に関する最新の最新の情報が必要な場合は、最初の方法を使用してください。切断を検出する際の遅延を許容できる場合は、2番目の方法が優れています。

第3の選択肢は、RMIのServer/SocketFactory実装の使用法を調べ、リモートオブジェクトをRMIによって作成された特定のソケットにリンクしようとすることです。私は前にこれをやったことがありますが、それは迅速な解決策ではありませんが、最小のオーバーヘッドで両方の世界のベストを与えることができます。

+1

それぞれのオブジェクトに別々のソケットファクトリを無駄に使用しない限り、リモートオブジェクトを特定のソケットにリンクすることはできません。 – EJP

関連する問題