通常情况下,您可以在 HttpClient 中设置一个 RetryHandler 或 RetryStrategy。具体实现取决于您使用的客户端类型。
如果您使用的是 Apache Http Client 5,可以这样设置 RetryStrategy:
@Bean
fun clientHttpRequestFactory(): ClientHttpRequestFactory {
val maxRetryAttempts = 3
val delayInMillis = 300L
val client = HttpClients.custom()
// 只会在低级别 I/O 异常或状态码为 429、503 时重试
.setRetryStrategy(DefaultHttpRequestRetryStrategy(maxRetryAttempts, TimeValue.ofMilliseconds(delayInMillis)))
.build()
return HttpComponentsClientHttpRequestFactory(client)
}
@Bean
fun customRestClient(clientHttpRequestFactory: ClientHttpRequestFactory): RestClient {
return RestClient.builder()
.requestFactory(clientHttpRequestFactory)
.build()
}
请注意,默认的 DefaultHttpRequestRetryStrategy 只会针对低级别的 IO 异常 或 状态码 429、503 进行重试。如果您需要特定的重试策略,可以自定义实现 RetryStrategy。
另外一种替代方案 是,您可以复用现有的已经配置了重试机制的 RestTemplate,并将其传递给 RestClient Builder:
@Bean
fun customRestClient(customRetryRestTemplate: RestTemplate): RestClient {
return RestClient
.builder(customRetryRestTemplate)
.build()
}