Чем 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 — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки