2017-01-05 11 views
1

私のアプリケーションでjavax.websocket APIを使用しています。私はこのように、サーバからクライアントへのメッセージを送信する:javax.websocket - メッセージ配信のタイムアウト

Future<Void> messageFuture = session.getAsyncRemote().sendText(message); 
messageFutures.add(messageFuture); // List<Future<Void>> messageFutures 

私は本当にパフォーマンスを気にして、各メッセージが配信されるまで、サーバーを待機させることができないため、サーバーは次のようになめらかにないので、私は、非同期APIを使用します。

for (i = 1..N) { 
    result = doStuff() 
    sendMessage(result) 
} 

したがって、繰り返しごとにメッセージ配信を待つことはできません。

私はすべてのメッセージを送った後、私はFutureが完了するのを待つ必要があります(すべてのメッセージが配信されます)。そして、安全のためには、「サーバがクライアントにメッセージを送信し、クライアントが30秒後に領収書を確認せず、WebSocketの接続が壊れていると思うようなタイムアウトを使用する必要があります」 - 私はWebSocket TCPで作業します。このセッションの前にミリ秒単位の非ゼロの数を設定し

それがアクティブでない場合、コンテナによって を閉鎖される、何もメッセージが送信または受信のどちらか ません。すなわち:

は方法session.setMaxIdleTimeout(long)あります。 0または負の値は、非アクティブなためにセッション が決してタイムアウトしないことを示します。

しかし、私が望むものであるかどうかは本当に分かりません(それは?)。では、javax.websocket APIを使用して説明したように、どのようにタイムアウトを設定できますか?

答えて

1

アイドルタイムアウトはケースをカバーする可能性がありますが、設計されていません。アイドルタイムアウトは、クライアントが接続を行う場合にはより多く適用されますが、頻繁にしか使用しません。

送信時のタイムアウトを確認するためのより正確な機能は、setAsyncSendTimeoutです。

これらの両方を使用すると、クライアントが一度に数分間分の接続をアイドル状態にしておくことができるように設定できますが、サーバーは比較的迅速な確認応答を期待します。


Springでの私の経験では、Springが提供するタイムアウトの実装は実際には設定できません。 How do you quickly close a nonresponsive websocket in Java Spring Tomcat?を参照してください。これがwebsocketの実装に該当するかどうかはわかりません。

+0

ありがとうございました!これがまさに私が必要としているようだ、 'ContainerProvider.getWebSocketContainer()。setAsyncSendTimeout(30_000)'のようなスムージーは、そのことをすべきである。幸いにも(またはそうでない)私のアプリはSpring上に構築されていません – coolguy

関連する問題