9

多くのサードパーティの REST データポイントからデータをフェッチし、すべてのデータを統合し、データを HTML 形式でレポートするために使用されるサーブレットがあります。次のフローを持つフィルターもあります-

  1. リクエストがフィルタにヒットしたときにイベント レコードを作成し、eventrecord オブジェクトをリクエストに追加します。
  2. chain.doFilter を実行する - サーブレットがイベントレコードに詳細を追加できるようにする
  3. ブラウザーに戻る途中で、filter は eventrecord オブジェクトを取得してログに記録します。

を使用して非同期サーブレットを使用するAsyncContext context = request.getAsyncContext();と、同じ REST データポイントと通信しますが、データの準備が整うと、すべての REST データポイントが応答するのを待つのではなく、応答ストリームに書き込みます。フィルターをどのように書き直しますか? ? REST データ ポイントからのデータのフラッシュを担当するスレッドにアタッチして、すべてのデータが処理およびフラッシュされると、 eventrecord をログに記録しますか? このようなユースケースを Servlet 3.0 の非同期サーブレットで処理する方法を理解するために研究できる一般的なパターンはありますか? JDK 6.0、Tomcat 7.0 を使用しています。

4

3 に答える 3

6

@WebFilter(urlPatterns = {"/*" }, asyncSupported = true)フィルターに web-xml を追加するだけです。

または追加<async-supported>true</async-supported>

于 2012-07-04T12:02:54.110 に答える
1

計装または診断フィルター (例: Codahales メトリクス フィルター)を適切にサポートする方法がわからないので、報奨金を出しました。

フィルターに追加<async-supported>true</async-supported>すると、確かに機能しているように見えますが、期待した結果が得られない場合があります (メトリックの場合、すべての要求は非常に高速に見えます)。

フィルターで AsyncContext をすぐに取得してメトリック データをバインドするのは良い考えのように思えるかもしれませんが、さまざまなコンテナーには明らかに問題があり、Spring のようなフレームワークにも問題があると思います (これは私の古いバージョンの Spring にすぎない可能性があります)。つまり、ほとんどのフレームワークは、リクエスト処理の前半が同期的であることを期待しています (これについては、私がかなり間違っている可能性があります)。

したがって、唯一の確実な方法は、フレームワーク レベルでフィルターを統合することです。たとえばorg.springframework.web.context.request.async.DeferredResultProcessingInterceptor、AsyncContext イベントにいくらか類似した Spring オファーがあります。

すべてのリクエストが Web フレームワークによって処理されるとは限らないため、これはやや残念なことですが、リクエストの最初の部分の処理と実際の処理には違いがあります (つまり、監視する必要がある 2 つのメトリックです)。

于 2016-07-07T16:30:42.787 に答える