zoukankan      html  css  js  c++  java
  • Feign 重试解析

    Spring cloud Feign 在restful 调用失败后,会进行重试。在没有到达指定重试次数,会一直重试。

     @Override
      public Object invoke(Object[] argv) throws Throwable {
        RequestTemplate template = buildTemplateFromArgs.create(argv);
        Retryer retryer = this.retryer.clone();
        while (true) {
          try {
            return executeAndDecode(template);
          } catch (RetryableException e) {
            retryer.continueOrPropagate(e);
            if (logLevel != Logger.Level.NONE) {
              logger.logRetry(metadata.configKey(), logLevel);
            }
            continue;
          }
        }
      }
    

     

    重试策略:

    public void continueOrPropagate(RetryableException e) {
          if (attempt++ >= maxAttempts) { //1. 超过最大重试次数,直接抛异常。
            throw e;
          }
    
          long interval;
          if (e.retryAfter() != null) {
            interval = e.retryAfter().getTime() - currentTimeMillis(); // 重试间隔
            if (interval > maxPeriod) { 
              interval = maxPeriod;
            }
            if (interval < 0) { //重试间隔到期,立即重试
              return;
            }
          } else {
            interval = nextMaxInterval();
          }
          try {
            Thread.sleep(interval); //未到期,线程休眠internal指定的时间
          } catch (InterruptedException ignored) {
            Thread.currentThread().interrupt();
          }
          sleptForMillis += interval; //统计线程休眠的时间
        }
    

      

  • 相关阅读:
    大道至简第四章读后感
    JAVA类与对象
    大道至简第三章读后感
    JAVA语法基础 动手动脑及课后作业
    课程作业01
    大道至简第二章读后感
    大道至简第一章读后感
    swift学习笔记之-自动引用计数
    swift学习笔记之-继承
    swift学习笔记之-闭包
  • 原文地址:https://www.cnblogs.com/lzmrex/p/9466776.html
Copyright © 2011-2022 走看看