spring-boot - Spring webclient - 每次重试后增加超时持续时间

标签 spring-boot timeout spring-webflux spring-webclient spring-retry

我正在寻找一种方法来增加连续重试网络客户端调用后的超时持续时间。

例如,我希望第一次请求在 50 毫秒后超时,第一次重试将在 500 毫秒后超时,第二次也是最后一次重试的超时持续时间为 5000 毫秒。

我不确定该怎么做。我只知道如何将所有重试的超时值设置为固定持续时间。

例如

public Flux<Employee> findAll() 
{
    return webClient.get()
        .uri("/employees")
        .retrieve()
        .bodyToFlux(Employee.class)
        .timeout(Duration.ofMillis(50))
        .retry(2);
}

最佳答案

您可以将退避和超时逻辑抽象为一个单独的实用程序函数,然后只需对您的发布者调用 transform()

在您的情况下,您似乎在使用基本退避功能 - 获取初始超时值,然后将其乘以一个因子,直到我们达到最大值。我们可以这样实现:

public <T> Flux<T> retryWithBackoffTimeout(Flux<T> flux, Duration timeout, Duration maxTimeout, int factor) {
    return mono.timeout(timeout)
            .onErrorResume(e -> timeout.multipliedBy(factor).compareTo(maxTimeout) < 1,
                    e -> retryWithBackoffTimeout(mono, timeout.multipliedBy(factor), maxTimeout, factor));
}

...但这当然可以是您喜欢的任何类型的超时逻辑。

有了这个实用函数,您的 findAll() 方法就变成了:

public Flux<Employee> findAll()
{
    return webClient.get()
            .uri("/employees")
            .retrieve()
            .bodyToFlux(Employee.class)
            .transform(m -> retryWithBackoffTimeout(m, Duration.ofMillis(50), Duration.ofMillis(500), 10));
}

关于spring-boot - Spring webclient - 每次重试后增加超时持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66642903/

相关文章:

java - 环境变量中的数据库凭据?

spring - VMware vFabric 服务器超时

networking - TCPConn SetWriteDeadline 不工作

java - 将/注销请求重定向到/api/logout webflux spring boot

java - Spring Data JPA - 如何保留任何现有或不存在的嵌套对象

hibernate - Spring服务在异常后不回滚事务

java - 如何更改 OAuth2ClientAuthenticationProcessingFilter 的 successHandler?

Javascript - 运行时优先级和队列

java - Spring webflux : how to use custom jackson ObjectWriter in ResponseEntityResultHandler?

java - Flux 为空时的last()操作