6

如果请求第一次失败,我希望为 HttpClient 实现HttpRequestRetryHandler 。

我还希望为后续重试实施指数退避。在数学上它可以实现为

E(c) = 1/2(2 次方 (c) -1)

在此处输入图像描述

但我现在正在努力使用 HttpRequestRetryHandler 在代码中实现它。

4

3 回答 3

4

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!
      }
   }
});
于 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);

该库经过充分测试和记录,可以通过 Maven Central 轻松集成。

我希望这能有所帮助。

于 2016-08-28T12:01:43.500 回答