/**
* 获取hs.net-openApiToken
* @param
* @return java.lang.String
* @author 德先生
* @Date 13:21 2021/5/24
*/
public static String getAuthToken() {
//首先从redis中获取
String authToken = LightDataConstant.HS_CACHE.get(LightDataConstant.QUANTIZATION_OPEN_API_AUTH_TOKEN_LIGHT_DATA_ALIAS, String.class);
//为空 http获取
if (StringUtils.isBlank(authToken)) {
//分布式锁:redis为空先上锁 配置文件默认生成锁的时间为30S
DistributedLock lock = DistributedLockFactory.buildLock(LightDataConstant.LOCK_QUAANTIZATION_FACTOR_AUTH_TOCKEN);
//获取到锁立即进入,获取不到锁10秒等待
Long waitSeconds = 10L;
if (lock.tryLock(waitSeconds, TimeUnit.SECONDS)) {
//进入锁后再判断一次redis是否有token
authToken = LightDataConstant.HS_CACHE.get(LightDataConstant.QUANTIZATION_OPEN_API_AUTH_TOKEN_LIGHT_DATA_ALIAS, String.class);
//再次没有,说明上次HTTP获取Token失败 尝试再次HTTP获取
if (StringUtils.isBlank(authToken)) {
//http获取Token
String authorization = "Basic" + " " + Base64.getEncoder().encodeToString((staticKey + ":" + staticSecret).getBytes(StandardCharsets.UTF_8));
AuthToken hsNetAuthToken = null;
try {
//form表单的形式提交
List<NameValuePair> nvps = new ArrayList<>();
nvps.add(new BasicNameValuePair("grant_type", "client_credentials"));
String queryStr = URLEncodedUtils.format(nvps, Consts.UTF_8);
ResponseEntity<AuthToken> responseEntity = staticHsNetClient.getAuthToken(authorization, queryStr);
hsNetAuthToken = responseEntity.getBody();
} catch (Exception e) {
log.error("调用hs.net-openApi接口:oauth2/oauth2/token,获取Token失败");
log.error(e.getMessage());
throw new BaseBizException(ResponseEnum.ERROR_SYSTEM.getErrorCode(), ResponseEnum.ERROR_SYSTEM.getErrorInfo());
}
//将结果放到缓存 缓存时间比它的失效时间小1800秒
assert hsNetAuthToken != null;
authToken = hsNetAuthToken.getAccessToken();
LightDataConstant.HS_CACHE.put(LightDataConstant.QUANTIZATION_OPEN_API_AUTH_TOKEN_LIGHT_DATA_ALIAS, authToken, hsNetAuthToken.getExpiresIn() - 1800);
}
//最后释放锁
try {
lock.unlock();
} catch (Exception e) {
log.error(e.getMessage());
}
} else {
//等待超过10s提示系统繁忙
log.info("HsNetOpenApiUtil.getAuthToken()等待超过10秒,未获取到锁,未进入HTTP请求");
throw new BaseBizException(ResponseEnum.ERROR_SYSTEM.getErrorCode(), ResponseEnum.ERROR_SYSTEM.getErrorInfo());
}
}
return authToken;
}
public static String freshAuthToken() {
String authToken;
//分布式锁:redis为空先上锁 配置文件默认生成锁的时间为30S
DistributedLock lock = DistributedLockFactory.buildLock(LightDataConstant.LOCK_QUAANTIZATION_FACTOR_AUTH_TOCKEN);
//获取到锁立即进入,获取不到锁立即拒绝
if (lock.tryLock()) {
//http获取Token
String authorization = "Basic" + " " + Base64.getEncoder().encodeToString((staticKey + ":" + staticSecret).getBytes(StandardCharsets.UTF_8));
AuthToken hsNetAuthToken = null;
try {
//form表单的形式提交
List<NameValuePair> nvps = new ArrayList<>();
nvps.add(new BasicNameValuePair("grant_type", "client_credentials"));
String queryStr = URLEncodedUtils.format(nvps, Consts.UTF_8);
ResponseEntity<AuthToken> responseEntity = staticHsNetClient.getAuthToken(authorization, queryStr);
hsNetAuthToken = responseEntity.getBody();
} catch (Exception e) {
log.error("调用hs.net-openApi接口:oauth2/oauth2/token,获取Token失败");
log.error(e.getMessage());
throw new BaseBizException(ResponseEnum.ERROR_SYSTEM.getErrorCode(), ResponseEnum.ERROR_SYSTEM.getErrorInfo());
}
//将结果放到缓存 缓存时间比它的失效时间小1800秒
assert hsNetAuthToken != null;
authToken = hsNetAuthToken.getAccessToken();
LightDataConstant.HS_CACHE.put(LightDataConstant.QUANTIZATION_OPEN_API_AUTH_TOKEN_LIGHT_DATA_ALIAS, authToken, hsNetAuthToken.getExpiresIn() - 1800);
//最后释放锁
try {
lock.unlock();
} catch (Exception e) {
log.error(e.getMessage());
}
} else {
//等待超过10s提示系统繁忙
log.info("HsNetOpenApiUtil.freshAuthToken()未获取到锁,立即拒绝,未进入HTTP请求");
throw new BaseBizException(ResponseEnum.ERROR_SYSTEM.getErrorCode(), ResponseEnum.ERROR_SYSTEM.getErrorInfo());
}
return authToken;
}
分布式锁获取token
于 2022-02-26 20:47:52 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)