Если я отправляю задачу 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());
}
}