寻找retryWhen的替代方案,因为它现在已被弃用,涉及IT技术。

13

我遇到了一个与 WebClientreactor-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:retry with backoff on specific error

但是,在最新版本的reactor中,以下方法已被弃用:

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

经过几个小时的搜索,我没有找到任何对这个问题的解决方案:是否有任何替代品可以与最新版本的reactor一起使用retryWhenRetry.onlyIf

感谢您的帮助!

2个回答

15

Retry曾经是作为reactor-extra的一部分分发的实用函数生成器。现在API已经稍作修改,并被引入到了reactor-core中(reactor.util.retry.Retry),旧的retryWhen()变体已被弃用。因此不再需要额外包含 - 在您的情况下,您可以这样做:

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

1
非常感谢,这正是我所寻找的 :) 谢谢你的解释 :D - Pierre Jones
在 reactor-extra 3.4.1 中找不到 Retry.fixedDelay... - user1955934
@user1955934 如同回答中所述 - 你需要的类现在在 reactor-core 中,而不是 reactor-extra - Michael Berry

0

在您现有的代码中添加 only withThrowable 可以使其正常工作。这对我很有效。您可以尝试类似以下的代码:

例如:

.retryWhen(withThrowable(Retry.any()
        .doOnRetry(e -> log
            .debug("Retrying to data for {} due to exception: {}", employeeId, e.exception().getMessage()))
        .retryMax(config.getServices().getRetryAttempts())
        .backoff(Backoff.fixed(Duration.ofSeconds(config.getServices().getRetryBackoffSeconds())))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接