如何使用 RestClient 进行可重试的调用

问题描述 投票:0回答:1

我想强制 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

实现类似的效果

这个问题的替代解决方案是什么?

java spring resttemplate
1个回答
0
投票

通常可以在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()
    }

© www.soinside.com 2019 - 2024. All rights reserved.