Spring AsyncTaskExecutor возвращает фьючерсы, которые не генерируют исключения - PullRequest
0 голосов
/ 06 февраля 2020

Если я отправляю задачу Callable в Spring 100 * (реализация по умолчанию AsyncTaskExecutor), я получаю Future, представляющий результат вычисления. Я знаю, что мой вызываемый вызов выдаст исключение, но когда я вызываю Future#get, метод возвращает null вместо генерирования исключения. Я обнаружил, что это тот случай, когда я вызываю AsyncTaskExecutor#submit напрямую и когда он неявно используется через аннотацию Spring * @Async.

В источнике ThreadPoolTaskScheduler я вижу переменную экземпляра ErrorHandler, которая, кажется, управляет тем, как фьючерсы генерируют исключения. Я попытался подключить пользовательский ErrorHandler, который отбросил бы любое исключение, которое он получил как RuntimeException, но по какой-то причине это не сработало. Когда я отправил запрос в конечную точку моего работающего приложения, он истек. Мое приложение не напечатало никаких журналов; даже те, которые Spring обычно печатает до того, как запрос попадает в мой контроллер REST. Обратите внимание, что я подключил свой ErrorHandler непосредственно к компоненту ThreadPoolTaskScheduler. Я не определил ErrorHandler как боб.

public class DataRetriever {
    @Autowired 
    private AsyncTaskExecutor taskExecutor;

    public List<Data> getData(String id) throws Exception {
      Future<List<Data>> futureData = getDataEventually(id);
      return futureData.get(); // exception should be thrown here
    }  

    private Future<List<Data>> getDataEventually(
        return taskExecutor.submit(() -> throw new RuntimeException());
    }
}
...