如何实现restTemplate的重试机制

Dil*_*oda 3 java spring spring-mvc spring-boot

我已经实现了一个通过 Resttemplate 调用外部服务的 java 方法。同样,我还在该方法中实现了一些额外的业务逻辑。我如何为这些休息调用实现重试机制。还需要考虑以下几点。

  1. 我无法为整个方法添加重试。
  2. 最好为rest调用添加重试(通过resttemplate)。
  3. 应该有一种方法可以禁用不需要的休息调用的重试选项。

小智 8

您可以在里面添加重试机制HttpClient并将其用于RestTemplate,像这样:

@Bean
public ClientHttpRequestFactory clientFactory() {
    HttpClient httpClient = HttpClients.custom()            
        .setRetryHandler((exception, executionCount, context) -> {
            if (executionCount > 3) {
                log.warn("Maximum retries {} reached", 3);
                return false;
            }
            if (<some condition for retry>) {
                log.warn("Retry {}", executionCount);
                return true;
            }
            return false;
        })
        .build();

    return new HttpComponentsClientHttpRequestFactory(httpClient);
}
@Bean
public RestTemplate customRestTemplate(@Qualifier("clientFactory") ClientHttpRequestFactory clientFactory){ 
    return new RestTemplate(clientFactory);
}
Run Code Online (Sandbox Code Playgroud)


Sam*_*bit 7

Spring 提供了带有@Retry注释的重试机制。您必须使用以下依赖项。

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.1.5.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

Spring 提供了以下注解。

Spring重试注解

@EnableRetry – 在 spring boot 项目中启用 spring 重试

@Retryable - 指示任何方法作为重试的候选者

@Recover – 指定回退方法

我在示例代码下方提供。

@Configuration
@EnableRetry
@SpringBootApplication
public class MyApplication {
}
Run Code Online (Sandbox Code Playgroud)

您可以参考完整的示例以了解更多信息。

  • 如果需要,您可以将方法拆分为小的内聚函数/方法,然后添加注释。 (2认同)
  • 是的,有一些限制,但它抽象了很多东西并使其更容易实现。 (2认同)