我希望爲一個HttpClient實現一個HttpRequestRetryHandler,以防第一次請求失敗。如何實現具有指數退避的HttpRequestRetryHandler?
我也希望爲後續重試實施Exponential backoff。數學上它可以作爲
但我掙扎了一段時間了實現它的代碼 與HttpRequestRetryHandler實現。
我希望爲一個HttpClient實現一個HttpRequestRetryHandler,以防第一次請求失敗。如何實現具有指數退避的HttpRequestRetryHandler?
我也希望爲後續重試實施Exponential backoff。數學上它可以作爲
但我掙扎了一段時間了實現它的代碼 與HttpRequestRetryHandler實現。
HttpRequestRetryHandler不允許你控制這個級別;如果你想做一些非常具體的事情,我建議你實現一些類似於Handler的地方,在那裏你可以發佈Runnables,延遲執行,例如使用Handler.postDelayed(),並根據你的公式增加延遲。
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);
該庫以及測試和記錄,並且可以通過Maven的中部很容易地集成。
我希望能有所幫助。
它需要JDK 1.8 – machinarium
嗨Gaurav,你最終的解決方案是什麼? – Jerome