春季反应式重试,有条件地采用指数补偿

时间:2019-04-05 14:34:25

标签: spring reactive exponential-backoff

使用springactive WebClient,我使用了一个API,并且如果响应状态为500,我需要使用指数退避重试。但是在Mono类中,我看不到带有谓词作为输入参数的retryBackoff。

这是我要搜索的功能:

public final Mono<T> retryBackoff(Predicate<? super Throwable> retryMatcher, long numRetries, Duration firstBackoff)

现在我的实现如下(我没有使用backOff机制重试):

client.sendRequest()
    .retry(e -> ((RestClientException) e).getStatus() == 500)
    .subscribe();

3 个答案:

答案 0 :(得分:0)

我不确定您使用的是哪个春季版本,在2.1.4中我有以下提示:

postgres

...这正是您想要的,对吧?

答案 1 :(得分:0)

您可能想看看reactor-addons项目中的reactor-extra模块。在Maven中,您可以执行以下操作:

<dependency>
    <groupId>io.projectreactor.addons</groupId>
    <artifactId>reactor-extra</artifactId>
    <version>3.2.3.RELEASE</version>
</dependency>

然后像这样使用它:

client.post()
    .syncBody("test")
    .retrieve()
    .bodyToMono(String.class)
    .retryWhen(Retry.onlyIf(ctx -> ctx.exception() instanceof RestClientException)
                    .exponentialBackoff(firstBackoff, maxBackoff)
                    .retryMax(maxRetries))

答案 2 :(得分:0)

我目前正在与Kotlin Coroutines + Spring WebFlux一起尝试:

似乎以下内容无效:

created_by