6

リクエストが最初に失敗した場合に備えて、HttpClientにHttpRequestRetryHandlerを実装したいと思います。

また、その後の再試行のために指数バックオフを実装したいと思います。数学的には、次のように実装できます。

E(c)= 1/2(2乗(c)-1)

ここに画像の説明を入力してください

しかし、私はHttpRequestRetryHandlerを使用してコードに実装するのにかなり長い間苦労しています。

4

3 に答える 3

4

HttpRequestRetryHandlerでは、そのレベルの制御はできません。そのような非常に具体的なことをしたい場合は、たとえばHandler.postDelayed()を使用して、数式に従って遅延を増やしてRunnablesをポストして実行できるようにする、 Handlerのようなものを実装することをお勧めします。

Handler mHandler = new Handler();
int mDelay = INITIAL_DELAY;

// try request
mHandler.postDelayed(mDelay, new Runnable() {
   public void run() {
      // try your request here; if it fails, then repost:
      if (failed) {
          mDelay *= 2;  // or as per your formula
          mHandler.postDelayed(mDelay, this);
      }
      else {
          // success!
      }
   }
});
于 2012-12-10T21:55:40.243 に答える
1

これがバックオフアルゴリズムを備えた優れたフレームワークです-https ://github.com/rholder/guava-retrying

于 2014-03-28T08:09:47.950 に答える
0

任意の関数呼び出しを再試行する戦略にguava-retryingを使用します。

私が書いたライブラリGuavaberryと統合します。これには、ランダムな間隔(別名ジッター)と組み合わせた堅実な指数バックオフを簡単に構築できるいくつかの待機戦略が含まれています:ExponentialJitterWaitStrategy

たとえば、15秒に制限され、呼び出し可能オブジェクトで50%のジッターを持つ指数バックオフを構築する場合:

Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
        .retryIfResult(Predicates.isNull())
        .withWaitStrategy(WaitStrategies.exponentialJitterWait(Duration.ofSeconds(15), 0.5D))
        .build();
retryer.call(callable);

ライブラリは十分にテストおよび文書化されており、MavenCentralを介して簡単に統合できます。

それがお役に立てば幸いです。

于 2016-08-28T12:01:43.500 に答える