私は春に慣れていないので、すべてのクライアントが利用できるようになったときにすぐに管理メッセージを表示するWebサイトの長いポーリングを実装したいと思います。グーグルで何時間も検索したところ、deferredresult(春3.2)を使用して実装できることがわかりました。質問は、deferredresultを使用して長いポーリングを実現する方法です。誰かがそのようなチュートリアルを紹介してくれれば幸いです。
3 に答える
もう1つのオプションは、AsyncContextを使用することです。これにより、最初のGET要求が「開いた」ままになり、1つの応答メッセージのみを送信できるDeferredResultとは異なり、応答の一部として複数のメッセージを送信できるようになります。これがその方法を説明する良いリンクです!
2つの基本的なオプションがあります。オプション1はCallableであり、Callableは文字列ビュー名を返します(@ResponseBodyまたはModelAndViewのような他の通常のSpringリターンタイプのいくつかを使用することもできますが、私はそれを調査したことがありません)。
オプション2は、CallableのようなDeferredResultを返すことです。ただし、それを別のスレッドに渡して、そこに結果を入力することができます。繰り返しになりますが、ModelAndViewを返すことができるか、@ResponseBodyを使用してXML/ JSONを返すことができるかどうかはわかりませんが、できると確信しています。
簡単な背景DeferredResult
:コントローラーは、最終的にはサーブレットコンテナー(さらに言えば、サーバーコンテナーがTomcatであると仮定します)ワーカースレッドによって実行される関数です。サービスフローはTomcatで始まり、Tomcatで終わります。Tomcatはクライアントから要求を取得し、接続を保持して、最終的にクライアントに応答を返します。コード(コントローラーまたはサーブレット)は途中にあります。
このフローを検討してください。
- Tomcatはクライアント要求を取得します。
- Tomcatがコントローラーを実行します。
- Tomcatスレッドを解放しますが、クライアント接続を維持し(応答を返さない)、別のスレッドで重い処理を実行します。
- 重い処理が完了したら、Tomcatをその応答で更新し、(Tomcatによって)クライアントに返します。
サーブレット(コード)とサーブレットコンテナ(Tomcat)は異なるエンティティであるため、このフローを許可するには(Tomcatスレッドを解放し、クライアント接続を維持する) 、サーブレットで導入されたパッケージであるコントラクトでこのサポートを行う必要があります。 3.0。Spring MVCは、コントローラーの戻り値がまたはの場合にこの新しいサーブレット3.0機能を使用しますが、これらは2つの異なるものです。はの一部であるインターフェイスであり、インターフェイスの改善です。クラスですjavax.servlet
DeferredResult
Callable
Callable
java.util
Runnable
DeferredResult
Spring MVCでの非同期リクエスト処理のオプション(これから説明します)を増やすためにSpringによって設計されました。このクラスは、Callable
実装が非同期コードを保持している間、結果(名前が示すとおり)を保持します。つまり、コントローラーで両方を使用し、で非同期コードを実行しCallable
、結果をで設定できることを意味しますDeferredResult
。これは、コントローラーの戻り値になります。DeferredResult
では、Callableの代わりに戻り値として使用すると何が得られますか?、、、などのDeferredResult
コールバックが組み込まれています。エラー処理が非常に簡単になります。さらに、これは単なる結果コンテナであるため、非同期コードで実行する任意のスレッド(またはスレッドプール)を選択できます。Callableでは、この選択肢はありません。onError
onTimeout
onCompletion
ここでCallable
は、両方のオプションとを使用して作成した簡単な実例を見つけることができますDeferredResult
。