无法拦截Spring @Async

时间:2019-05-14 12:45:28

标签: java spring-boot spring-async

我有一个用@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操作。

1 个答案:

答案 0 :(得分:0)

AsyncHandlerInterceptor用于Web请求,@Async是常规注释,它允许将方法执行委派给线程池。不足为奇,这些在一起效果不佳。

@Async允许提供线程池的名称。您可以创建自己的池,将所有提交的任务包装到您的类中,以便稍后您将拦截与任务有关的所有操作。