使用Spring WebFlux中的webclient在Mono上有条件地重复或重试

使用Spring WebFlux中的webclient在Mono上有条件地重复或重试,第1张

使用Spring WebFlux中的webclient在Mono上有条件地重复或重试

是的,有可能。

Mono
有两个用于重新订阅(因此,重新触发请求)的概念

  • 重试 =重新订阅上游是否完成但有异常
  • 重复 =重新订阅上游是否成功完成

每个概念都有

Mono
针对不同用例的多种重载方法。寻找
retry*
repeat*
方法。例如,要无延迟重试最大次数,请使用
retry(intnumRetries)

通过

retryWhen
repeatWhen
方法支持更复杂的用例,如以下示例所示。

重试时间

要重试单声道是否异常完成最多5次,每次尝试之间间隔5秒:

// From reactor-core >= v3.3.4.RELEASEimport reactor.util.retry.Retry;this.webClient        .post()        .uri(SERVICE_URL)        .body(BodyInserters.fromValue(docRequest))        .retrieve()        .bodyToMono(document.class)        .retryWhen(Retry.fixedDelay(5, Duration.ofSeconds(5)))        .delaySubscription(Duration.ofSeconds(10))

重试构建器支持其他退避策略(例如指数)和其他选项,以完全自定义重试。

请注意,

retryWhen(Retry)
上面使用的方法已添加到反应堆核心v3.3.4.RELEASE中,并且
retryWhen(Function)
不建议使用该方法。在reactor-
core v3.3.4.RELEASE之前,您可以使用reactor-
extras
项目中的重试功能构建器来创建一个
Function
传递给
retryWhen(Function)

重复时间

如果您需要成功重复一次,请使用

.repeatWhen
.repeatWhenEmpty
代替
.retryWhen
上面的内容。

使用reactor-
extras
项目中的重复函数构建器来创建重复

Function
,如下所示:

// From reactor-extrasimport reactor.retry.Repeat;this.webClient        .post()        .uri(SERVICE_URL)        .body(BodyInserters.fromValue(docRequest))        .retrieve()        .bodyToMono(document.class)        .filter(document -> !document.isEmpty())        .repeatWhenEmpty(Repeat.onlyIf(repeatContext -> true)     .exponentialBackoff(Duration.ofSeconds(5), Duration.ofSeconds(10))     .timeout(Duration.ofSeconds(30)))        .delaySubscription(Duration.ofSeconds(10))

如果要重新订阅成功或失败,也可以将a

.retry*
与a 链接在一起
.repeat*



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4895227.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存