如何升级过滤器以支持Servlet 3.0异步servlet

时间:2012-05-28 21:50:46

标签: java-ee-6 server-push servlet-3.0

我有一个servlet,用于从许多第三方REST数据点获取数据,集成所有数据并以HTML格式报告数据。我还有一个过滤器,它有以下流程 -

  1. 当请求到达过滤器并将eventrecord对象添加到请求时创建事件记录
  2. 执行chain.doFilter - 允许servlet向eventrecord添加更多详细信息
  3. 在返回浏览器的路上,filter获取eventrecord对象并记录它。
  4. 现在,如果我使用AsyncContext context = request.getAsyncContext();使用异步servlet,它将与相同的REST数据点进行通信,但是当数据准备就绪时,它将写入响应流而不是等待所有REST数据点响应,我该怎么写我的过滤器?是否会附加到负责从REST数据点刷新数据的线程,以便一旦处理完所有数据并将其记录下来,它将记录事件记录? 有没有可以学习的常见模式来理解如何使用Servlet 3.0的异步servlet处理这样的用例? 我使用的是JDK 6.0,Tomcat 7.0。

3 个答案:

答案 0 :(得分:6)

只需在web-xml中为您的过滤器添加@WebFilter(urlPatterns = {"/*" }, asyncSupported = true)

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

答案 1 :(得分:1)

由于我不确定自己如何正确支持工具或诊断过滤器(例如Codahales metrics filters),我已经提供了赏金。

向您的过滤器添加<async-supported>true</async-supported>肯定会使它们看起来有效,但可能无法获得您期望的结果(在指标的情况下,您的所有请求都会显得非常快)。

在过滤器中立即获取AsyncContext以绑定度量数据but various containers apparently have issues with this似乎是一个好主意,我相信像Spring这样的框架也存在问题(这可能只是我的旧版Spring)。这是大多数框架期望请求处理的前半部分是同步的(我可能在这方面严重错误)。

因此,似乎唯一可靠的方法是在框架级别集成过滤器。例如,Spring提供org.springframework.web.context.request.async.DeferredResultProcessingInterceptor,这有点类似于AsyncContext事件。

这有点不幸,因为并非所有请求都可能由Web框架处理,但是再次处理请求的第一部分和实际完成之间存在差异(即,现在可能需要监视两个指标)。

答案 2 :(得分: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() {
    }
}