我想在等待10秒后重试请求3次,当响应是5xx.但我没有看到我可以使用的方法.在对象上
WebClient.builder()
.baseUrl("...").build().post()
.retrieve().bodyToMono(...)
我可以看到方法:
在重试计数但无延迟的条件下重试
.retry(3, {it is WebClientResponseException && it.statusCode.is5xxServerError} )
带回退和次数但无条件重试
.retryBackoff
还有一个retryWhen
,但我不知道如何使用它
6条答案
按热度按时间2mbi3lxu1#
使用reactor-extra,您可以这样做:
**更新:**使用新API,相同的解决方案将:
mitkmikd2#
您可以通过以下方法来实现此目的:
exchange()
方法获取没有异常的响应,然后在5xx响应上引发特定(自定义)异常(这与retrieve()
不同,retrieve()
总是引发4xx
或5xx
状态的WebClientResponseException
);reactor-extra
-它包含了一个很好的方式来使用retryWhen()
进行更复杂和更具体的重试。然后你可以指定一个随机的回退重试,在10秒后开始,上升到任意时间,最多尝试3次。(当然,你也可以使用other available methods来选择一个不同的策略。)例如:
k75qkfdt3#
我认为不赞成使用带有Retry.anyOf和Retry.onlyIf的retryWhen。我发现这种方法很有用,它允许我们处理和抛出用户定义的异常。
例如:
gopyfrb34#
wswtfjt75#
在现有代码中只添加withThrowable就可以让它工作。这对我来说很有效。你可以尝试这样做:
例如:
uxhixvfz6#
我是这么做的: