【发布时间】:2014-09-04 22:57:15
【问题描述】:
我正在尝试创建一个具有多个异步过滤器的 Java 应用程序,但似乎无法让它们很好地协同工作。我认为主要问题在于 run() 方法,我不知道如何将请求传递给链中的下一个过滤器。我试过chain.doFilter(request, response),但这似乎不起作用,AsyncContext 上有dispatch() 和complete() API,但它们似乎关闭了整个AsyncContext。似乎必须有另一种方法才能让它发挥作用。下面是我正在使用的过滤器的 sn-p - 第二个过滤器看起来几乎相同。
注意:我正在添加标头以尝试找出被调用的内容。
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
final AsyncContext asyncContext = request.startAsync();
final HttpServletResponse res = (HttpServletResponse) response;
asyncContext.addListener(new AsyncListener() {
@Override
public void onComplete(AsyncEvent event) throws IOException {
res.addHeader("S-AST2", "onComplete");
}
@Override
public void onTimeout(AsyncEvent event) throws IOException {
res.addHeader("S-AST3", "onTimeout");
}
@Override
public void onError(AsyncEvent event) throws IOException {
res.addHeader("S-AST4", "onError");
}
@Override
public void onStartAsync(AsyncEvent event) throws IOException {
res.addHeader("S-AST0", "onStartAsync");
}
});
asyncContext.start(new Runnable() {
@Override
public void run() {
res.addHeader("S-AST1", "before");
// This doesn't seem to work...
asyncContext.dispatch();
// ... or this ...
asyncContext.complete();
// ... or this ...
chain.doFilter(request, response);
}
});
}
感谢您的任何见解!
【问题讨论】:
标签: java servlets asynchronous filter servlet-filters