Spring Web客户端-每次重试后增加超时时间



我正在寻找一种方法,在连续重试Web客户端调用后,增加超时时间。

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

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

前任。

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));
}

你探索过@Retryable吗?如果没有,这里是选项。添加此依赖项

<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>

注释您的主类

@EnableRetry
public class MainClass{
...
}

然后对调用调用的事务进行注释

public interface BackendAdapter {

@Retryable(
value = {YourCustomException.class},
maxAttempts = 4,
backoff = @Backoff(random = true, delay = 1000, maxDelay = 5000, multiplier = 2)
)
public String getBackendResponse(boolean simulateretry, boolean simulateretryfallback);
}

如果您将延迟设置为1000ms,将maxDelay设置为5000ms,并将multiplexer设置为值2,则4次尝试的重试时间如下所示:

Retry 1 — 1605
Retry 2 — 2760
Retry 3 — 7968
Retry 4 — 14996

相关内容

  • 没有找到相关文章

最新更新