是的,有可能。
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*。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)