如果主机脱机,则重试 java RestTemplate HTTP 请求

嗨,我正在使用弹簧来调用REST API。API 可能非常慢,甚至可能处于脱机状态。我的应用程序正在通过一个接一个地发送数千个请求来构建缓存。响应也可能非常慢,因为它们包含大量数据。RestTemplate

我已经将超时增加到120秒。我现在的问题是API可以脱机,我得到一个例外。org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool

在 API 脱机的情况下,应用程序应等待并重试,直到 API 再次联机。

我能否在不自行构建异常循环的情况下开箱即用地实现这一点?RestTemplate

谢谢!


答案 1

我有同样的情况,并做了一些谷歌搜索找到了解决方案。在希望中给出答案可以帮助别人。您可以为每次尝试设置最大尝试次数和时间间隔。

@Bean
  public RetryTemplate retryTemplate() {

    int maxAttempt = Integer.parseInt(env.getProperty("maxAttempt"));
    int retryTimeInterval = Integer.parseInt(env.getProperty("retryTimeInterval"));

    SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
    retryPolicy.setMaxAttempts(maxAttempt);

    FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
    backOffPolicy.setBackOffPeriod(retryTimeInterval); // 1.5 seconds

    RetryTemplate template = new RetryTemplate();
    template.setRetryPolicy(retryPolicy);
    template.setBackOffPolicy(backOffPolicy);

    return template;
  }

我想执行的休息服务在下面。

retryTemplate.execute(context -> {
        System.out.println("inside retry method");
        ResponseEntity<?> requestData = RestTemplateProvider.getInstance().postAsNewRequest(bundle, ServiceResponse.class, serivceURL,
                CommonUtils.getHeader("APP_Name"));

        _LOGGER.info("Response ..."+ requestData);
            throw new IllegalStateException("Something went wrong");
        });

答案 2

您还可以使用 Spring Retry 来处理此注释驱动的问题。这样,您将避免实现模板。

把它添加到你的pom中.xml

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.1.2.RELEASE</version>
</dependency>

为您的应用程序/配置启用它

@SpringBootApplication
@EnableRetry
public class MyApplication {
  //...
}

保护有故障危险的方法@Retryable

@Service
public class MyService {

  @Retryable(maxAttempts=5, value = RuntimeException.class, 
             backoff = @Backoff(delay = 15000, multiplier = 2))
  public List<String> doDangerousOperationWithExternalResource() {
     // ...
  }

}

推荐