异步拦截器
异步拦截器
Spring MVC 给提供了异步拦截器,能让我们更深入的参与进去异步 request 的生命周期里面去。其中最为常用的为:AsyncHandlerInterceptor:
public class AsyncHelloInterceptor implements AsyncHandlerInterceptor {
// 这是Spring3.2提供的方法,专门拦截异步请求的方式
@Override
public void afterConcurrentHandlingStarted(
HttpServletRequest request,
HttpServletResponse response,
Object handler
)
throws Exception {
System.out.println(
Thread.currentThread().getName() +
"---afterConcurrentHandlingStarted-->" +
request.getRequestURI()
);
}
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler
)
throws Exception {
System.out.println(
Thread.currentThread().getName() +
"---preHandle-->" +
request.getRequestURI()
);
return true;
}
@Override
public void postHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView
)
throws Exception {
System.out.println(
Thread.currentThread().getName() +
"---postHandle-->" +
request.getRequestURI()
);
}
@Override
public void afterCompletion(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex
)
throws Exception {
System.out.println(
Thread.currentThread().getName() +
"---afterCompletion-->" +
request.getRequestURI()
);
}
}
AsyncHandlerInterceptor 提供了一个 afterConcurrentHandlingStarted()方法, 这个方法会在 Controller 方法异步执行时开始执行, 而 Interceptor 的 postHandle 方法则是需要等到 Controller 的异步执行完才能执行。比如我们用 DeferredResult 的话,afterConcurrentHandlingStarted 是在 return 的之后执行,而 postHandle()是执行.setResult()之后执行。
需要说明的是:如果我们不是异步请求,afterConcurrentHandlingStarted 是不会执行的。所以我们可以把它当做加强版的 HandlerInterceptor 来用。平时我们若要使用拦截器,建议使用它。同样可以注册 CallableProcessingInterceptor 或者一个 DeferredResultProcessingInterceptor 用于更深度的集成异步 request 的生命周期:
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
// 注册异步的拦截器、默认的超时时间、任务处理器TaskExecutor等等
//configurer.registerCallableInterceptors();
//configurer.registerDeferredResultInterceptors();
//configurer.setDefaultTimeout();
//configurer.setTaskExecutor();
}