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; //统计线程休眠的时间
        }
    

      

  • 相关阅读:
    mysql赋权限
    MySQL Server 5.6安装
    Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
    每天一个linux命令
    解锁scott用户
    堆栈的理解
    类与对象的理解
    数组copy
    ArrayList 的代码
    intput/output 文件的复制练习
  • 原文地址:https://www.cnblogs.com/lzmrex/p/9466776.html
Copyright © 2011-2022 走看看