异步拦截器

异步拦截器

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方法异步执行时开始执行,InterceptorpostHandle方法则是需要等到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();
}
上一页