2011-05-30 10 views
2

RMI接続を作成しましたが、クライアントの終了時またはクラッシュ時にサーバーに通知する方法がわかりません。私は unreferenced()メソッドを見つけましたが、動作しません。何か案が?
(サーバーがマルチクライアントの場合、クライアントには1種類のオブジェクトしか渡されませんが、どのクライアントもインスタンスが異なります)。
ありがとうございます。Java - RMIによるクライアントクラッシュの検出

答えて

6

問題は、クライアントがクラッシュした場合、何かをするのは難しく、タイムアウトを待つことになります。

通常の解決方法は、定期的な呼び出しである「ハートビート」を設定することです。クライアントのハートビートが、例えば2つの期間の後にあなたに届かない場合、それは死んでいると判断します。

+0

ご返信ありがとうございます。この仕組みは私の最後の選択でした。なぜなら私はより良い選択肢があると思っていたからです。とにかく、サーバーはクライアントをどのように呼び出すことができますか?サーバーは現在、次のもののみを使用しています。\t \t \t LocateRegistry.createRegistry(RMI_PORT); Naming.rebind(...); クライアントに「ping」する方法はありますか? ありがとうもう一度:) – Simon

2

実際にはunreferenced()メソッドは機能しますが、そうする前にDGCの時間間隔が必要です。これは、JDKのバージョンによって異なります。私が最後に見た時、それは10分だった。これを制御するシステムプロパティがあります.Java RMIのホームページを参照してください。この機能は、クライアントが必要とするAPIを実装するクライアント固有のRemoteSessionオブジェクトを介して使用され、クライアントの状態を追跡し、APIを介してクライアント自体が生き残ったりログアウトしたりするのを防ぐためのフェイルセーフとしてUnreferencedを実装します。

クライアント側のコールバックがない限り、クライアントが最後に呼び出した時刻を記録する以外に、クライアントクラッシュを検出する信頼できる方法は他にありません。しかし、これらはセキュリティ上のリスクとして広く見なされており、一般的には特別な処理をしないとファイアウォールでは機能しません。