当前位置: 首页 > 知识库问答 >
问题:

Spring RestTemplate:指数退避重试策略

宗涵蓄
2023-03-14
    null

有没有一种方法可以在Spring RestTemplate中使用指数退避?

共有1个答案

容远
2023-03-14

日安!

我想,通过实现自定义睡眠器类可以实现所需的行为。

接下来,您需要将此睡眠器设置为BackOffPolicy,如下所示:

public class RetryTest {

  public static final Logger LOG = LoggerFactory.getLogger(RetryTemplate.class);

  @org.junit.Test
  public void testRT() {
    RetryTemplate retryTemplate = new RetryTemplate();
    final SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
    retryPolicy.setMaxAttempts(5);
    retryTemplate.setRetryPolicy(retryPolicy);

    Sleeper sleeper = new Sleeper() {
      private long timeToSleep = 0;
      @Override
      public void sleep(long timeout) throws InterruptedException {
        if (timeToSleep ==0) {
          timeToSleep = timeout;
        } else {
          timeToSleep = (long) (timeToSleep * Math.E);
        }
        LOG.warn("sleeping for: {}", timeToSleep);
        Thread.sleep(timeToSleep);
      }
    };
    FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy().withSleeper(sleeper);
    retryTemplate.setBackOffPolicy(backOffPolicy);
    retryTemplate.execute(new RetryCallback<Void, ResourceAccessException>() {
      @Override
      public Void doWithRetry(RetryContext retryContext) throws ResourceAccessException {
        LOG.debug(">RetryCount: {}", retryContext.getRetryCount());
        new RestTemplate().getForObject("https://unreachable.host", String.class);
        return null;
      }
    });
  }
}
 类似资料:
  • 当对骆驼使用Kafka组件时,从Kafka消费时有两种方法可以重试: null org.apache.kafka.clients.Consumer.internals.AbstractCoordinator[Consumer ClientID=Consumer-1,GroupID=2862121D-DDC9-4111-A96A-41BA376C0143]此成员将离开组,因为使用者轮询超时已过期。这

  • 我正在处理一项任务,该任务要求在读取请求消息通道(Queuechannel)中的消息后向外部soap服务客户端发送请求,该通道的原始源是。 消息通道使用消息驱动适配器从获取数据。 消息通道由轮询(通过)将这些消息发送到服务激活器。 (soap client)依次连接到soap服务,并在根据消息中的标头值生成一些逻辑后返回响应。 外部soap服务供应商要求我们以指数方式重试或重发此消息。例如1s,1

  • 问题内容: 对于这样的任务: 如果它引发异常,而我想从守护程序端重试,如何应用指数回退算法,例如,等数秒后? 还可以从服务器端维护重试,以便如果工作进程被杀死,那么产生的下一个工作进程将执行重试任务? 问题答案: 该属性包含到目前为止的尝试次数,因此您可以使用它来实现指数补偿: 为防止雷电群问题,您可以考虑在指数补偿中添加随机抖动:

  • 在RetryTemplate里面,执行excuter方法是重试还是失败是由RetryPolicy决定的,这也是一个RetryContext工厂.这个RetryTemplate有责任使用当前的策略创建一个RetryContext并且把它注入到RetryCallback在每一次尝试中。回调失败后RetryTemplate必须由RetryPolicy决定使其更新状态(存储在RetryContext中),

  • 下面是execute()方法所做的事情

  • 当响应为5xx时,我想在等待10秒后重试请求3次。但我看不到一个我能用的方法。在对象上 吾见方法: 在有重试计数但无延迟的条件下重试 有退避和次数但没有条件的重试 还有一个,但我不确定如何使用它