リクエストが最初に失敗した場合に備えて、HttpClientにHttpRequestRetryHandlerを実装したいと思います。
また、その後の再試行のために指数バックオフを実装したいと思います。数学的には、次のように実装できます。
しかし、私はHttpRequestRetryHandlerを使用してコードに実装するのにかなり長い間苦労しています。
リクエストが最初に失敗した場合に備えて、HttpClientにHttpRequestRetryHandlerを実装したいと思います。
また、その後の再試行のために指数バックオフを実装したいと思います。数学的には、次のように実装できます。
しかし、私はHttpRequestRetryHandlerを使用してコードに実装するのにかなり長い間苦労しています。
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!
}
}
});
これがバックオフアルゴリズムを備えた優れたフレームワークです-https ://github.com/rholder/guava-retrying
任意の関数呼び出しを再試行する戦略に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を介して簡単に統合できます。
それがお役に立てば幸いです。