1

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

4

1 回答 1

0

AsyncHandlerInterceptor用于 Web 请求,@Async是通用注释,允许将方法执行委托给线程池。毫不奇怪,这些不能很好地协同工作。

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

于 2019-05-14T14:07:45.133 回答