Skip to content

Latest commit

 

History

History
15 lines (9 loc) · 1.63 KB

File metadata and controls

15 lines (9 loc) · 1.63 KB

01-SpringMVC的AsyncHandlerInterceptor异步的处理器拦截器

HandlerInterceptor 类扩展了一个回调方法,该方法在异步请求处理开始后被调用。当处理器启动一个异步请求时,DispatcherServlet 退出而不会像处理同步请求那样调用 postHandle 和 afterCompletion,因为请求处理的结果(例如 ModelAndView)可能尚未准备好,并将由另一个线程并发生成。在这种情况下,会调用 afterConcurrentHandlingStarted,允许实现类在释放线程到 Servlet 容器之前执行清理线程绑定属性等任务。

当异步处理完成时,请求会被调度到容器进行进一步处理。在这个阶段,DispatcherServlet 会调用 preHandle、postHandle 和 afterCompletion。为了区分初始请求和异步处理完成后的后续调度,拦截器可以检查 jakarta.servlet.ServletRequest 的 jakarta.servlet.DispatcherType 是 "REQUEST" 还是 "ASYNC"。

HandlerInterceptor 实现可能需要在异步请求超时或由于网络错误而完成时进行处理。对这种case,Servlet 容器不会调度,因此不会调用 postHandle 和 afterCompletion。相反地,拦截器可通过 WebAsyncManager#registerCallbackInterceptor、registerDeferredResultInterceptor 注册来跟踪异步请求。这可以在每个请求的 preHandle 中主动完成,而不管是否会启动异步请求处理。

自版本 3.2 起提供。

另请参见:

  • org.springframework.web.context.request.async.WebAsyncManager
  • org.springframework.web.context.request.async.CallableProcessingInterceptor
  • org.springframework.web.context.request.async.DeferredResultProcessingInterceptor