9

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

  1. 当请求命中过滤器时创建事件记录,并将 eventrecord 对象添加到请求中
  2. 执行 chain.doFilter - 允许 servlet 向事件记录添加更多详细信息
  3. 在返回浏览器的路上,filter 获取 eventrecord 对象并记录它。

现在,如果我使用 Asynchronous servlet using AsyncContext context = request.getAsyncContext();,它将与相同的 REST 数据点通信,但是当数据准备好时,它将写入响应流而不是等待所有 REST 数据点响应,我将如何重新编写我的过滤器? 它是否会附加到负责从 REST 数据点刷新数据的线程,以便在处理和刷新所有数据后,它将记录事件记录?是否有任何通用模式可供我研究以了解如何使用 Servlet 3.0 的异步 servlet 处理此类用例?我正在使用 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)。那就是大多数框架都希望请求处理的前半部分是同步的(我可能对此大错特错)。

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

这有点令人遗憾,因为并非所有请求都可能由 Web 框架处理,但是处理请求的第一部分和实际执行之间还是有区别的(即,现在这是您可能想要监控的两个指标)。

于 2016-07-07T16:30:42.787 回答
0

@WebFilter 注解已在 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() {
    }
} 
于 2016-07-14T08:10:43.347 回答