Ищу альтернативу retryWhen, которая теперь устарела - PullRequest
1 голос
/ 17 июня 2020

У меня проблема с WebClient и reactor-extra. Действительно, у меня есть следующий метод:

public Employee getEmployee(String employeeId) {
            return webClient.get()
                    .uri(FIND_EMPLOYEE_BY_ID_URL, employeeId)
                    .retrieve()
                    .onStatus(HttpStatus.NOT_FOUND::equals, clientResponse -> Mono.empty())
                    .onStatus(HttpStatus::is5xxServerError, clientResponse -> Mono.error(new MyCustomException("Something went wrong calling getEmployeeById")))
                    .bodyToMono(Employee.class)
                    .retryWhen(Retry.onlyIf(ConnectTimeoutException.class)
                             .fixedBackoff(Duration.ofSeconds(10))
                             .retryMax(3))
                    .block();
    }

Я обнаружил, что могу использовать retryWhen(Retry.onlyIf(...)), потому что я хочу повторить попытку, только если выдается ConnectTimeoutException. Я нашел это решение из этого сообщения: spring webclient: повторить попытку с отсрочкой при определенной c ошибке

Но в последней версии reactor следующий метод стал устаревшим:

public final Mono<T> retryWhen(Function<Flux<Throwable>, ? extends Publisher<?>> whenFactory)

После нескольких часов поиска в Google я не нашел решения этого вопроса: есть ли альтернатива для retryWhen и Retry.onlyIf с последними версиями reactor

Спасибо за помощь!

1 Ответ

4 голосов
/ 17 июня 2020

Retry, по сути, был генератором служебных функций, распространяемым как часть reactor-extra. API был немного изменен и переведен в reactor-core (reactor.util.retry.Retry), при этом старый вариант retryWhen() устарел. Так что больше не нужно включать лишнее - в вашем случае вы можете сделать что-то вроде:

.retryWhen(Retry.fixedDelay(3, Duration.ofSeconds(10))
        .filter(e -> e instanceof ConnectTimeoutException))
...