Невозможно перехватить Spring @Async - PullRequest
1 голос
/ 14 мая 2019

У меня есть публичный метод, помеченный @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 голосов
/ 14 мая 2019

AsyncHandlerInterceptor для веб-запросов, @Async - это общая аннотация, которая позволяет делегировать выполнение метода пулу потоков. Не удивительно, что они не работают хорошо вместе .

@Async позволяет указать имя пула потоков. Вы можете создать свой собственный пул, который обернет все отправленные задачи в ваш класс, чтобы позже вы перехватили всю работу с задачей.

...