Spring WebClient如何配置不同重试次数对应不同延迟的重试策略
结论
fixedBackoff(固定退避策略)无法实现分档差异化重试延迟需求。该策略的设计目标就是为所有重试请求配置统一的间隔时长,原生不支持按重试次序设置不同延迟,不需要再尝试基于它做改造。
实现代码
直接替换原有固定退避配置为自定义分档退避逻辑即可,你已经注入的三个分档时长配置、异常匹配规则、最大重试次数、重试日志逻辑都可以直接复用:
public MyService(WebClient client, @Value("${retry.quantity}") int retries, @Value("${retry.time.first}") int firstTime, @Value("${retry.time.second}") int secondTime, @Value("${retry.time.rest}") int restTime) { this.client = client; this.customRetry = Retry.anyOf(ResponseException.class) .retryMax(retries) // 自定义分档退避规则 .backOffsFromContext(ctx -> { long retryCount = ctx.iteration(); if (retryCount == 1) { return Duration.ofMinutes(firstTime); } else if (retryCount == 2) { return Duration.ofMinutes(secondTime); } else { return Duration.ofMinutes(restTime); } }) .doOnRetry(exception -> log.error("Exception on Retry is {} .", exception) ); }
注意事项
- 重试上下文中的
iteration()计数从1开始,和你定义的「第一次/第二次/第三次及后续」的分档规则完全匹配,不需要额外做偏移计算 - 代码中默认用
Duration.ofMinutes做时间转换,如果你的配置项单位是秒,替换成Duration.ofSeconds即可,和实际配置单位保持一致 - 后续如果要调整分档数量、各档延迟时长,只需要修改配置和对应分支判断逻辑即可,不需要改动整体重试框架
内容的提问来源于stack exchange,提问作者Richi101
相关产品推荐
相关产品推荐

