ApiWxAuthorizeResponse apiResponse = new ApiWxAuthorizeResponse(); // final String KEY_PREFIX = "xcx_accessToken_"; try { // String redisData = strings.get(KEY_PREFIX + Const.APP_ID); String redisData = redisTemplate.opsForValue().get(token_cache_key); // log.info("生成token接口:access_token=" + redisData); LogUtils.debug("", com.eshore.small_program.common.log.definition.RequestMethod.GET, "生成token接口:access_token=" + redisData, 0l, 0l, 0l); WxMessageTokenResponse response; // 实际超时时间 long expiresIn; if (StringUtil.isBlank(redisData)) { getRedisSpinLock(token_get_key, 1000, 3); // 获取分布式锁 redisData = redisTemplate.opsForValue().get(token_cache_key); //重新获取redis值 } if (StringUtil.isBlank(redisData)) { // 缓存中不存在access_token // response = WxMessageUtil.getInstance().getToken(globalConfig, globalConfig.getAppId(), globalConfig.getAppSecret()); response = wxService.getToken(globalConfig.getAppId(), globalConfig.getAppSecret()); if (response == null) { return apiResponse; } // 设置key、value值 redisTemplate.opsForValue().set(token_cache_key, JSON.toJSONString(response), response.getExpires_in(), TimeUnit.SECONDS); // strings.set(KEY_PREFIX + Const.APP_ID, JSON.toJSONString(response)); // 设置key有效期 // keys.expired(KEY_PREFIX + Const.APP_ID, response.getExpires_in()); expiresIn = response.getExpires_in(); } else { response = JSON.parseObject(redisData, WxMessageTokenResponse.class); // expiresIn = keys.ttl(KEY_PREFIX + Const.APP_ID); expiresIn = redisTemplate.getExpire(token_cache_key, TimeUnit.SECONDS); } if (response != null) { apiResponse.setAccessToken(response.getAccess_token()); if (expiresIn > 60) { expiresIn = expiresIn - 60; } else { expiresIn = 0; } apiResponse.setExpiresIn(String.valueOf(expiresIn)); } logDebugExtension("{}", "authorize", JSONObject.toJSONString(apiResponse)); return apiResponse; } catch (Exception e) { log.error("异常:生成token接口失败", e); return apiResponse; } finally { releaseRedisLock(token_get_key); }
时间: 2024-02-14 15:27:52 浏览: 146
该代码段是一个生成access_token的方法。它首先尝试从redis缓存中获取access_token,如果缓存中不存在,则通过调用wxService的getToken方法从微信服务器获取access_token,并将其存储到redis缓存中。最后,它返回一个包含access_token和有效期的ApiWxAuthorizeResponse对象。
该方法的执行流程如下:
1. 创建一个ApiWxAuthorizeResponse对象apiResponse。
2. 尝试从redis缓存中获取access_token,存储在变量redisData中。
3. 如果redisData为空,则获取分布式锁,并重新从redis缓存中获取access_token。
4. 如果redisData仍然为空,则调用wxService的getToken方法获取access_token,并将其存储到redis缓存中。
5. 设置apiResponse的accessToken和expiresIn属性。
6. 记录日志并返回apiResponse。
7. 最后释放分布式锁。
如果在整个过程中发生异常,则记录错误日志并返回apiResponse。
请注意,代码中存在一些注释和日志记录,这些部分可能与代码的完整性和功能无关。
相关问题
ApiWxAuthorizeResponse apiResponse = new ApiWxAuthorizeResponse(); // final String KEY_PREFIX = "xcx_accessToken_"; try { // String redisData = strings.get(KEY_PREFIX + Const.APP_ID); String redisData = redisTemplate.opsForValue().get(token_cache_key); // log.info("生成token接口:access_token=" + redisData); LogUtils.debug("", com.eshore.small_program.common.log.definition.RequestMethod.GET, "生成token接口:access_token=" + redisData, 0l, 0l, 0l); WxMessageTokenResponse response; // 实际超时时间 long expiresIn; if (StringUtil.isBlank(redisData)) { getRedisSpinLock(token_get_key, 1000, 3); // 获取分布式锁 redisData = redisTemplate.opsForValue().get(token_cache_key); //重新获取redis值 }
根据你提供的代码片段,这段代码是一个用于获取 access_token 的逻辑。
首先,创建了一个 `ApiWxAuthorizeResponse` 的实例对象 `apiResponse`。
然后,通过调用 `redisTemplate.opsForValue().get(token_cache_key)` 方法从缓存中获取 `redisData`,其中 `token_cache_key` 是之前在 `afterPropertiesSet()` 方法中设置的键。
接下来,打印了日志 `log.info("生成token接口:access_token=" + redisData)`,或者记录了一个调试级别的日志 `LogUtils.debug("", com.eshore.small_program.common.log.definition.RequestMethod.GET, "生成token接口:access_token=" + redisData, 0l, 0l, 0l)`。这两行代码可能是用于调试或记录日志信息。
然后,声明了一个 `WxMessageTokenResponse` 类型的变量 `response`,用于存储从缓存中解析得到的 `redisData`。
接着,声明了一个 `expiresIn` 变量,用于存储实际的超时时间。
然后,通过判断 `redisData` 是否为空或空白,如果为空,则获取分布式锁(通过调用 `getRedisSpinLock()` 方法)并重新从缓存中获取 `redisData`。
这段代码的目的是从缓存中获取 access_token,如果缓存中不存在或已过期,则重新获取。获取到的 `redisData` 可能是一个 JSON 字符串,将被解析为 `WxMessageTokenResponse` 对象,并将超时时间赋给 `expiresIn` 变量。
需要注意的是,具体的实现细节可能涉及到其他方法,如 `getRedisSpinLock()` 方法和日志记录的相关实现。
public String getToken() { final ValueOperations valOps = redisTemplate.opsForValue(); //从redis中读取token是否存在 String accessToken = (String) valOps.get(DouYinConstants.ACCESS_TOKEN_KEY); if (accessToken == null) { //获取Token DouYinTokenResponse remoteToken = getRemoteToken(); if (remoteToken != null) { //将token存入redis if (valOps.setIfAbsent(DouYinConstants.ACCESS_TOKEN_KEY, remoteToken.getData().getAccess_token())) { //设置过期时间 valOps.getOperations().expire(DouYinConstants.ACCESS_TOKEN_KEY, 1000, TimeUnit.SECONDS); accessToken = remoteToken.getData().getAccess_token(); } else { throw new RuntimeException("缓存AccessToken失败!"); } } } return accessToken; }
这段代码主要用于获取访问令牌 (access token),并使用 Redis 存储该令牌。
首先,它使用 RedisTemplate 从 Redis 中读取 access token 的值。如果从 Redis 中获取的值为空,则调用 getRemoteToken() 方法获取远程访问令牌。然后,使用 Redis 的 setIfAbsent() 方法将新获取的访问令牌存储在 Redis 中。如果 Redis 中存在同名键,则 setIfAbsent() 方法不会覆盖已存在的键值对,并返回 false。最后,使用 Redis 的 expire() 方法设置该访问令牌的过期时间。
如果 setIfAbsent() 方法返回 false,则抛出 "缓存AccessToken失败" 的运行时异常。
阅读全文