web-dev-qa-db-ja.com

ホストがオフラインの場合、再試行Java RestTemplate HTTP要求

こんにちは、REST APIの呼び出しにRestTemplateスプリングを使用しています。 APIは非常に遅くなることもあり、オフラインになることもあります。私のアプリケーションは、何千ものリクエストを次々に送信してキャッシュを構築しています。多くのデータが含まれているため、応答も非常に遅くなる可能性があります。

タイムアウトはすでに120秒に増やしています。私の問題は、APIがオフラインになり、org.Apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool例外が発生することです。

APIがオフラインでない場合、アプリケーションはAPIが再びオンラインになるまで待機して再試行する必要があります。

自分で例外ループを作成せずに、すぐにRestTemplateでこれを達成できますか?

ありがとう!

15

私は同じ状況にあり、いくつかのグーグルで解決策を見つけました。それが他の誰かを助けることを期待して答えを与える。各試行の最大試行と時間間隔を設定できます。

@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");
        });
11
Devender Kumar

Spring Retryプロジェクトを使用( https://dzone.com/articles/spring-retry-ways-integratehttps://github.com/spring-projects/spring-retry )。

あなたのような問題を解決するように設計されています。

7
Rafal G.

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() {
     // ...
  }

}
5
cheffe