使用 Reactor Mono 记录重试

cod*_*box 5 java project-reactor spring-webflux

我正在使用 Reactive Streams 调用 Web 服务,并配置了自动重试策略,以便如果初始调用失败,将尝试多次重试。我希望能够记录每次重试,但在文档中找不到执行此操作的方法。Mono 对象具有doOn...用于各种事件的方法,例如成功、失败等,但我看不到doOnRetry. 谁能建议一种方法来做到这一点?我的代码看起来像这样:

return webClient.get()
    .uri(myUrl)
    .retrieve()
    .bodyToMono(byte[].class)
    .retryBackoff(RETRIES, MIN_BACKOFF_DURATION, MAX_BACKOFF_DURATION)
    .doOnSubscribe(subscription -> LOGGER.info("subscribe"))
    .doOnSuccess(result -> LOGGER.info("success"))
    //.doOnRetry(something -> LOGGER.info("retry")) <-- I want to do this
    .doOnError(err -> LOGGER.info("error"));
Run Code Online (Sandbox Code Playgroud)

cod*_*box 5

好的,我找到了一种方法,将Reactor Extra Utilities包添加到我的项目中。这使我可以将retryBackoff上面示例中的方法替换为以下内容:

.retryWhen(Retry.any()
    .retryMax(RETRIES)
    .exponentialBackoff(MIN_BACKOFF_DURATION, MAX_BACKOFF_DURATION)
    .doOnRetry(context -> LOGGER.warn("retry")))
Run Code Online (Sandbox Code Playgroud)


Hil*_*lle 5

Reactor Core 版本 3.3.4开始,您可以使用经过大修的retryWhen模型;喜欢:

[...]
.retryWhen(Retry.backoff(5, Duration.ofSeconds(2))
        .doBeforeRetry(retrySignal -> {
            log.error("Retrying: "
                    + retrySignal.totalRetries() + "; "
                    + retrySignal.totalRetriesInARow() + "; "
                    + retrySignal.failure());
        }));
Run Code Online (Sandbox Code Playgroud)