Чем completeOnTimeout() отличается от orTimeout() у CompletableFuture

Оба метода добавляют таймаут к CompletableFuture, но реагируют на его истечение по-разному.

orTimeout(long, TimeUnit) при истечении завершает future исключительно — через TimeoutException. Future переходит в состояние completed exceptionally, и ошибка полетит дальше по цепочке, если её не перехватить через handle или exceptionally.

completeOnTimeout(T value, long, TimeUnit) при истечении завершает future обычным значением — тем, что передали первым аргументом. Ошибки не будет, цепочка продолжит работу как если бы результат пришёл вовремя.

CompletableFuture withError = call() .orTimeout(2, TimeUnit.SECONDS);

CompletableFuture withFallback = call() .completeOnTimeout( "default", 2, TimeUnit.SECONDS );

Спросят следом: что если сам call() уже завершился с ошибкой до истечения таймаута? Оба метода не трогают future, которая уже завершена — они действуют только если future ещё не завершена к моменту срабатывания таймера. Ещё уточнят: оба метода добавлены в Java 9 и возвращают ту же future, поэтому их можно вставлять в середину цепочки без разрыва типа.

orTimeout — для случаев, где таймаут это ошибка. completeOnTimeout — для случаев, где есть разумный fallback и исключение не нужно.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки