我有一个用@Async
注释的公共方法。该方法不在控制器中。我想在线程执行完成后拦截线程,以便清除某些ThreadLocals。
我已经调查了AsyncHandlerInterceptor
,但是当控制器收到请求时而不是在执行@Async
之前和之后都遇到了问题。
public class SampleAsyncHandlerInterceptor implements AsyncHandlerInterceptor {
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("afterConcurrentHandlingStarted " + request.getRequestURI());
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle " + request.getRequestURI());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle " + request.getRequestURI());
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion " + request.getRequestURI());
}
}
我想要的是类似CallableProcessingInterceptor的拦截器,但用于@Async
操作。
答案 0 :(得分:0)
AsyncHandlerInterceptor
用于Web请求,@Async
是常规注释,它允许将方法执行委派给线程池。不足为奇,这些在一起效果不佳。
@Async
允许提供线程池的名称。您可以创建自己的池,将所有提交的任务包装到您的类中,以便稍后您将拦截与任务有关的所有操作。