我正在寻找一种方法来增加连续重试网络客户端调用后的超时持续时间。
例如,我希望第一次请求在 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/