我想强制 Spring 6.1
RestClient
使用重试机制执行所有 http 调用。
理想情况下,我想复制可以使用 RestTemplate
和 spring-retry
RetryTemplate
: 实现的行为
RetryTemplate retryTemplate = retryTemplate(retryProperties);
return new RestTemplate(requestFactory) {
@Override
public <T> ResponseEntity<T> exchange(
URI url,
HttpMethod method,
HttpEntity<?> requestEntity,
Class<T> responseType) {
return retryTemplate.execute(
context -> super.exchange(url, method, requestEntity, responseType));
}
};
由于多种原因,这种方法在这种情况下无效,但我正在寻找一种解决方案来使用
RestClient
实现类似的效果
这个问题的替代解决方案是什么?
通常可以在HttpClient中设置RetryHandler/Strategy。根据您使用的客户端,实现可能会有所不同。
如果您使用的是 Apache Http Client 5,您可以通过以下方式设置 RetryStrategy:
@Bean
fun clientHttpRequestFactory(): ClientHttpRequestFactory {
val maxRetryAttempts = 3
val delayInMillis = 300L
val client = HttpClients.custom()
// Will only retry on low level I/O exceptions or status codes 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()
}