异步拦截器

异步拦截器

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();
}
上一页