From ab7d0050d73894534ea7778fe99b396f4e5f28f8 Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Wed, 10 Jun 2020 18:12:29 +0800 Subject: [PATCH] fix bug --- .../com/iformall/aop/RedisCacheAspect.java | 168 +++++++++--------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java b/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java index 9a491cd30..6b1c8eac0 100644 --- a/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java +++ b/mallinkCApi/src/main/java/com/iformall/aop/RedisCacheAspect.java @@ -56,90 +56,90 @@ public class RedisCacheAspect { @Around("cacheAspect()") public Object round(ProceedingJoinPoint jp) throws Throwable { -// HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); -// // 查询token信息 -// //从header中获取token -// String token = request.getHeader("token"); -// //如果header中不存在token,则从参数中获取token -// if (StringUtils.isBlank(token)) { -// token = request.getParameter("token"); -// } -// log.info("token>>>>>>>>>>>>>>>"+token); -// String tenantId; -// WxCUser wxCUser = null ; -// if(StringUtils.isNotBlank(token)) { -// wxCUser = userTokenService.getByToken(token); -// } -// if (Objects.isNull(wxCUser) || wxCUser.getExpireTime().getTime() < System.currentTimeMillis()) { -// tenantId = "0"; -// } else { -// tenantId = wxCUser.getTenantId(); -// } -// -// // 请求参数 -// Object[] args = jp.getArgs(); -// // 接口 返回结果 -// Object result; -// String redisKey; -// -// //得到注释的名称 -// MethodSignature signature = (MethodSignature) jp.getSignature(); -// //判断tag是否在用户权限中 如果存在加入参数查询 -// Method method = signature.getMethod(); -// RedisCache cache = method.getAnnotation(RedisCache.class) ; -// if (cache.autoKey()) { -// // 构建 redisKey => reqPath:tenantId:md5(param1_param2_param3) -// String requestUrl = request.getRequestURI(); -// // 接口路径 reqPath => /api/xxx -// String reqPath = requestUrl.substring(requestUrl.indexOf("/api/")); -// if (cache.md5()) { -// String md5Before = StringUtils.join(args, DELIMITER_PARAMS); -// redisKey = StringUtils.join(reqPath, DELIMITER_KEY, tenantId, DELIMITER_KEY, HashUtil.md5(StringUtils.join(token, md5Before, DELIMITER_PARAMS))); -// } else { -// redisKey = StringUtils.join(reqPath, DELIMITER_KEY, tenantId, DELIMITER_KEY, StringUtils.join(token,args, DELIMITER_PARAMS)); -// } -// } else { -// redisKey = cache.key(); -// } -// -// // redisKey 不存在,获取接口数据并返回 -// if (StringUtils.isBlank(redisKey)) { -// result = jp.proceed(args); -// } else { -// ValueOperations valueOperations = stringRedisTemplate.opsForValue(); -// String value = valueOperations.get(redisKey); -// if (value == null) { -// String lockKey = StringUtils.join(redisKey, ":", "lock"); -// long time = System.currentTimeMillis() + 2000; -// String timeStr = String.valueOf(time); -// try { -// //分布式锁,保证一个线程读DB,其它线程排队 -// if (redisLock.lock2(lockKey, timeStr)) { -// log.debug("CacheAspect 读库中, key:{}: " + lockKey); -// result = jp.proceed(args); -// String json_data = JSONObject.toJSONString(result); -// valueOperations.set(redisKey, json_data, cache.expireTime(), cache.dateUnit()); -// log.debug("CacheAspect 缓存不存在,获取接口数据并放入缓存,key:{}, expire:{}", redisKey, cache.expireTime()); -// } else { -// log.debug("CacheAspect 读库等待中, key:{}: " + lockKey); -// Thread.sleep(2000); -// value = valueOperations.get(redisKey); -// result = parseCache(jp, redisKey, value); -// } -// } catch (Throwable throwable) { -// log.error("CacheAspect proceed error , Illegal argument: {} in {}.{}()", Arrays.toString(jp.getArgs()), -// jp.getSignature().getDeclaringTypeName(), jp.getSignature().getName(), throwable); -// throw throwable; -// } finally { -// redisLock.unlock(lockKey, timeStr); -// } -// } else { -// result = parseCache(jp, redisKey, value); -// } -// // 计数器 -// stringRedisTemplate.opsForHash().increment("hotapi", redisKey, 1); -// } -// return result; + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + // 查询token信息 + //从header中获取token + String token = request.getHeader("token"); + //如果header中不存在token,则从参数中获取token + if (StringUtils.isBlank(token)) { + token = request.getParameter("token"); + } + log.info("token>>>>>>>>>>>>>>>"+token); + String tenantId; + WxCUser wxCUser = null ; + if(StringUtils.isNotBlank(token)) { + wxCUser = userTokenService.getByToken(token); + } + if (Objects.isNull(wxCUser) || wxCUser.getExpireTime().getTime() < System.currentTimeMillis()) { + tenantId = "0"; + } else { + tenantId = wxCUser.getTenantId(); + } + + // 请求参数 + Object[] args = jp.getArgs(); + // 接口 返回结果 + Object result; + String redisKey; + + //得到注释的名称 + MethodSignature signature = (MethodSignature) jp.getSignature(); + //判断tag是否在用户权限中 如果存在加入参数查询 + Method method = signature.getMethod(); + RedisCache cache = method.getAnnotation(RedisCache.class) ; + if (cache.autoKey()) { + // 构建 redisKey => reqPath:tenantId:md5(param1_param2_param3) + String requestUrl = request.getRequestURI(); + // 接口路径 reqPath => /api/xxx + String reqPath = requestUrl.substring(requestUrl.indexOf("/api/")); + if (cache.md5()) { + String md5Before = StringUtils.join(args, DELIMITER_PARAMS); + redisKey = StringUtils.join(reqPath, DELIMITER_KEY, tenantId, DELIMITER_KEY, HashUtil.md5(StringUtils.join(token, md5Before, DELIMITER_PARAMS))); + } else { + redisKey = StringUtils.join(reqPath, DELIMITER_KEY, tenantId, DELIMITER_KEY, StringUtils.join(token,args, DELIMITER_PARAMS)); + } + } else { + redisKey = cache.key(); + } + + // redisKey 不存在,获取接口数据并返回 + if (StringUtils.isBlank(redisKey)) { + result = jp.proceed(args); + } else { + ValueOperations valueOperations = stringRedisTemplate.opsForValue(); + String value = valueOperations.get(redisKey); + if (value == null) { + String lockKey = StringUtils.join(redisKey, ":", "lock"); + long time = System.currentTimeMillis() + 2000; + String timeStr = String.valueOf(time); + try { + //分布式锁,保证一个线程读DB,其它线程排队 + if (redisLock.lock2(lockKey, timeStr)) { + log.debug("CacheAspect 读库中, key:{}: " + lockKey); + result = jp.proceed(args); + String json_data = JSONObject.toJSONString(result); + valueOperations.set(redisKey, json_data, cache.expireTime(), cache.dateUnit()); + log.debug("CacheAspect 缓存不存在,获取接口数据并放入缓存,key:{}, expire:{}", redisKey, cache.expireTime()); + } else { + log.debug("CacheAspect 读库等待中, key:{}: " + lockKey); + Thread.sleep(2000); + value = valueOperations.get(redisKey); + result = parseCache(jp, redisKey, value); + } + } catch (Throwable throwable) { + log.error("CacheAspect proceed error , Illegal argument: {} in {}.{}()", Arrays.toString(jp.getArgs()), + jp.getSignature().getDeclaringTypeName(), jp.getSignature().getName(), throwable); + throw throwable; + } finally { + redisLock.unlock(lockKey, timeStr); + } + } else { + result = parseCache(jp, redisKey, value); + } + // 计数器 + stringRedisTemplate.opsForHash().increment("hotapi", redisKey, 1); + } + return result; return null; }