2012-05-28 14 views
8

サーブレットは、多くのサードパーティRESTデータポイントからデータを取得し、すべてのデータを統合し、HTML形式でレポートするために使用します。サーブレットは、よりを追加することができます -サーブレット3.0非同期サーブレットをサポートするためにフィルタをアップグレードする方法

  1. がchain.doFilterを実行し、要求がフィルタに当たるとイベント・レコードを作成し、要求
  2. にeventrecordオブジェクトを追加 - 私はまた、次のフローを持つフィルタを持っています詳細はイベントレコードに
  3. 途中でブラウザは、イベントレコードオブジェクトを取得してログに記録します。

今、私は同じRESTデータポイントにはなくてお話しますAsyncContext context = request.getAsyncContext();を使用して、非同期サーブレットを使用して、データの準備ができているとき、それは代わりに、すべてのRESTデータポイントが応答するのを待つの応答ストリームに書き込みする場合は、私はどのように私のフィルタを書くだろうか? RESTデータポイントからデータをフラッシュするスレッドにアタッチされるので、すべてのデータが処理されてフュージョンされると、イベントレコードがログに記録されますか? サーブレット3.0の非同期サーブレットでこのようなユースケースをどのように扱うことができるかを理解するために調査できる共通のパターンはありますか? JDK 6.0、Tomcat 7.0を使用しています。

答えて

7

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

または私はわからないんだと、私は適切にインストルメントまたは診断フィルター(例えばCodahales metrics filters)をサポートするために、どのように自分自身を奨励金を入れている<async-supported>true</async-supported>

0

を追加します。

フィルタにを追加すると、それが正常に動作するようになりますが、期待した結果が得られない場合があります(メトリックの場合、すべてのリクエストは非常に高速です)。

メッシュデータbut various containers apparently have issues with thisをバインドするためのフィルタですぐにAsyncContextを取得することをお勧めします。私はSpringのようなフレームワークにも問題があると考えています。これはSpringの古いバージョンかもしれません。ほとんどのフレームワークは、要求処理の前半が同期的であることを期待しています(これは大したことではありません)。

したがって、フレームワークレベルでフィルタを統合するのは唯一の愚かな方法ではないようです。たとえば、AsyncContextイベントに多少似ているSpringの提供はorg.springframework.web.context.request.async.DeferredResultProcessingInterceptorです。

これは、すべての要求がWebフレームワークで処理されるわけではないが、要求の最初の部分を処理して実際に実行すること(つまり、これで2つのメトリックを監視することができる)が異なるため、やや残念です。

0

@WebFilter AnnotationはJava EE 6で導入されています。filterName、asyncSupported、servletNamesなどの別の要素を定義します。@WebFilterはorderを定義していないため、web.xmlなしでは使用できません。 @WebFilterは、web.xmlの他の設定を減らします。

@WebFilter(filterName="filterOne") 
public class FilterOne implements Filter { 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 
    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     System.out.println("Inside filter one."); 
     chain.doFilter(request, response); 
    } 
    @Override 
    public void destroy() { 
    } 
} 
関連する問題