RefreshResult handleFetchedSuccess()

in src/main/java/com/aliyun/credentials/provider/RefreshCachedSupplier.java [106:150]


    RefreshResult<T> handleFetchedSuccess(RefreshResult<T> value) {
        logger.verbose("Refresh credentials successfully, retrieved value is {}, cached value is {}", value, cachedValue);
        consecutiveRefreshFailures.set(0);
        long now = new Date().getTime();
        // 过期时间大于15分钟,不用管
        if (now < value.staleTime()) {
            logger.verbose("Retrieved value stale time is {}. Using staleTime "
                    + "of {}", ParameterHelper.getTimeString(value.staleTime()), ParameterHelper.getTimeString(value.staleTime()));
            return value;
        }
        // 不足或等于15分钟,但未过期,下次会再次刷新
        if (now < value.staleTime() + STALE_TIME) {
            logger.warning("Retrieved value stale time is in the past ({}). Using staleTime "
                    + "of {}", ParameterHelper.getTimeString(value.staleTime()), ParameterHelper.getTimeString(now));
            return value.toBuilder().staleTime(now).build();
        }
        logger.warning("Retrieved value expiration time of the credential is in the past ({}). Trying use the cached value.", ParameterHelper.getTimeString(value.staleTime() + STALE_TIME));
        // 已过期,看缓存,缓存若大于15分钟,返回缓存,若小于15分钟,则根据策略判断是立刻重试还是稍后重试
        if (null == this.cachedValue) {
            throw new CredentialException("No cached value was found.");
        } else if (now < this.cachedValue.staleTime()) {
            logger.warning("Cached value staleTime is {}. Using staleTime of {}", ParameterHelper.getTimeString(this.cachedValue.staleTime()), ParameterHelper.getTimeString(this.cachedValue.staleTime()));
            return cachedValue;
        } else {
            switch (staleValueBehavior) {
                case STRICT:
                    // 立马重试
                    logger.warning("Cached value expiration is in the past (" + this.cachedValue.staleTime() + "). Using expiration "
                            + "of " + (now + 1000));
                    return cachedValue.toBuilder().staleTime(now + 1000).build();
                case ALLOW:
                    // 一分钟左右重试一次
                    long waitUntilNextRefresh = 50 * 1000 + JITTER.nextInt(20 * 1000 + 1);
                    long nextRefreshTime = now + waitUntilNextRefresh;
                    logger.warning("Cached value expiration has been extended to " + nextRefreshTime + " because the downstream "
                            + "service returned a time in the past: " + value.staleTime());
                    return cachedValue.toBuilder()
                            .staleTime(nextRefreshTime)
                            .build();
                default:
                    throw new IllegalStateException("Unknown stale-value-behavior: " + staleValueBehavior);
            }

        }
    }