import cn.hutool.core.util.BooleanUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;
@Slf4j
public class AzueTokenUtil {
private static final String AZURE_TOKEN_KEY = "azure:token:";
private static final String AZURE_TOKEN_LOCK = "azure:lock:";
private static AzureStorageConfig config = SpringUtilsAuTo.getBean(AzureStorageConfig.class);
private static final int duration = 3;
public static String getAzureToken(String containerName){
//查到token在有效期内直接返回,逻辑判断提前30分钟过期
Object azureTokenStr = RedisUtils.get(AZURE_TOKEN_KEY+containerName);
if(azureTokenStr != null && StringUtils.isNotBlank(azureTokenStr.toString())){
AzureToken azureToken = JSONObject.parseObject(azureTokenStr.toString(), AzureToken.class);
if(azureToken.getExpireTime().isAfter(LocalDateTime.now().plusHours(1L))){
return azureToken.getToken();
}
}
//如果查询token为空或者token过期更新redis中的token
if(tryLock(AZURE_TOKEN_LOCK+containerName)){
try {
//获取azuretoken并写入redis
String sasToken = BlobHelper.getSasToken(containerName,config);
AzureToken azureToken = new AzureToken();
azureToken.setToken(sasToken);
azureToken.setExpireTime(LocalDateTime.now().plusDays(duration));
String redisJson = JSONObject.toJSONString(azureToken);
RedisUtils.set(AZURE_TOKEN_KEY+containerName,redisJson,duration,TimeUnit.DAYS);
} catch (Exception e) {
log.error("azure获取文件token" + e.getMessage());
} finally {
unLock(AZURE_TOKEN_LOCK+containerName);
}
}
return getAzureToken(containerName);
}
static boolean tryLock(String key){
Boolean flag = RedisUtils.setIfAbsent(key, "1", 10, TimeUnit.SECONDS);
return BooleanUtil.isTrue(flag);
}
static boolean unLock(String key){
return RedisUtils.del(key);
}
}
TokenUtil
于 2024-03-10 21:23:50 首次发布
本文介绍了AzueTokenUtil类,用于管理Azure存储容器的token。当token即将过期时,通过Redis缓存和锁机制自动获取新的SasToken并更新,确保服务的稳定性和效率。
摘要由CSDN通过智能技术生成