2012-03-31 13 views
1

Javaのホットスワップソケットにコードを書き込もうとしています。ホットスワップServerSocket(Java)

// initial server initialization 
ServerSocket server1 = new ServerSocket(port); 

// ... code to accept and process requests 

// new server initialization 
ServerSocket server2 = new ServerSocket(); 

// attempt at hotswap 
server1.close(); 
server2.bind(port); 

// .. more code 

をコードは、上記のように動作しますが、私は最初のソケットが閉じている時間と二番目の間の落下のメッセージの可能性について疑問に思って:ここで

は、私が現在使用しているコードの骨子であります開かれる。

2つの質問

接続が切断されないようにする方法はありますか?

接続が切断されないようにする方法がある場合は、ServerSocketクラスのインスタンスが異なる仮想マシンにある場合でも動作しますか?

ありがとうございます。

+1

あなたは何を達成しようとしていますか? –

+0

'server1'で' bind'を繰り返し呼び出そうとしましたか? – phineas

+0

anders:私は単に、別のJVMが着信要求を失うことなく、または現在の接続を失うことなく、サーバーを「引き継ぐ」ことを可能にするコードを達成しようとしています。 – nikdeapen

答えて

0

ServerSocketの終了は、そののハンドラが新しい着信接続を処理しないことを意味します。これはserver2によって処理されます。ここまでは順調ですね。 server1が接続されていないときには、server1を収集することができます。Socketが残っています。

最初のServerSocketが閉じられてから2番目のServerSocketが開かれた後に、OSネットワーキングドライバでポートが「開かない」とマークされている期間が短くなります(OSがわからないため)最初のソケットを閉じた直後に新しいソケットを開始する意図)。

この間に入ってくるTCP要求は、ポートが開いていないというメッセージが表示され、ポートが開いていないという確認が得られたため、再試行しない可能性があります。着信要求ごとに新しいスレッドを生成

可能な回避策使用するJava NIO構築物は、のServerSocketChannelを参照し、これにはいくつかの構造を持つライブラリhttp://netty.io/をチェックしてください。

着信リクエストのハンドラを動的に(スレッドセーフに)設定できることを確認してください。これにより、着信リクエストの処理をシームレスに変更することができます。は、 ServerSocket(しかし、それはまさにあなたが望むものではないでしょう)。

関連する問題