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