2012-05-28 97 views
8

我有一個servlet用於從許多第三方REST數據點獲取數據,集成所有數據並以HTML格式報告數據。我也有它具有以下流量的過濾器 -如何升級過濾器以支持Servlet 3.0異步servlet

  1. 創建一個事件記錄,當請求到達過濾器和eventrecord對象添加到請求
  2. 執行chain.doFilter - 這允許servlet添加更多事件記錄的細節
  3. 回到瀏覽器的路上,過濾器獲取eventrecord對象並記錄它。

現在,如果我用用AsyncContext context = request.getAsyncContext();,它會跟同一個REST的數據點,但由於異步servlet和當數據準備好,將會寫入響應流,而不是等待所有的REST數據點作出反應,我怎麼會重新寫我的過濾器?它會被附加到負責從REST數據點刷新數據的線程,以便一旦所有數據都被處理並傳出,它將記錄事件記錄? 有沒有我可以研究的常見模式,以瞭解如何使用Servlet 3.0的異步servlet處理這些用例? 我使用的是JDK 6.0,Tomcat 7.0。

回答

7

只需在web-xml中爲您的過濾器添加@WebFilter(urlPatterns = {"/*" }, asyncSupported = true)即可。

或者添加<async-supported>true</async-supported>

0

我已經把賞金因爲我不確定自己如何正確地支持插裝或診斷濾光器(例如Codahales metrics filters)。

雖然將<async-supported>true</async-supported>添加到您的過濾器當然會使它們看起來有效,但它可能無法獲得您期望的結果(對於指標,您的所有請求看起來都非常快)。

在篩選器中立即獲取AsyncContext來綁定度量數據似乎是一個好主意,我相信像Spring這樣的框架也有問題(這可能只是我的舊版本的Spring)。這是大多數框架期望前半部分的請求處理是同步的(我可能大量錯誤)。

因此,它似乎是唯一的傻瓜證明方式是在框架級集成過濾器。例如,Spring提供了org.springframework.web.context.request.async.DeferredResultProcessingInterceptor,這與AsyncContext事件有些類似。

這有點不幸,因爲並非所有請求都可能由Web框架處理,但是再次處理請求的第一部分和實際滿足(即現在是您可能想要監視的兩個指標)之間存在差異。

0

@WebFilter Annotation已在Java EE 6中引入。它定義了不同的元素,如filterName,asyncSupported和servletNames等。@WebFilter不能在沒有web.xml的情況下使用,因爲@WebFilter沒有定義順序。 @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() { 
    } 
}