From 24a8d17e007545f7426c48352109aa1a9c6587ee Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期三, 06 五月 2020 12:02:09 +0800 Subject: [PATCH] IOS上线隐藏我的界面的banner与超级会员升级信息 --- fanli/src/main/java/com/yeshi/fanli/aspect/RequestSerializableAspect.java | 169 ++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 102 insertions(+), 67 deletions(-) diff --git a/fanli/src/main/java/com/yeshi/fanli/aspect/RequestSerializableAspect.java b/fanli/src/main/java/com/yeshi/fanli/aspect/RequestSerializableAspect.java index e635489..ca188f2 100644 --- a/fanli/src/main/java/com/yeshi/fanli/aspect/RequestSerializableAspect.java +++ b/fanli/src/main/java/com/yeshi/fanli/aspect/RequestSerializableAspect.java @@ -1,8 +1,6 @@ package com.yeshi.fanli.aspect; -import java.io.IOException; import java.io.PrintWriter; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; @@ -14,26 +12,57 @@ import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.cache.Cache; -import org.springframework.cache.Cache.ValueWrapper; -import org.springframework.cache.ehcache.EhCacheCacheManager; +import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.annotation.Order; +import org.springframework.expression.EvaluationContext; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.stereotype.Component; import org.yeshi.utils.JsonUtil; import com.yeshi.fanli.log.LogHelper; +import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.annotation.RequestSerializableByKey; + +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.params.SetParams; @Component @Aspect @Order(4) public class RequestSerializableAspect { @Resource - private EhCacheCacheManager cacheManager; + private JedisPool jedisPool; - @Around("execution(public * com.yeshi.fanli.controller.client.*.*(..))") - public Object requestSerializable(ProceedingJoinPoint joinPoint) throws IOException { + private ExpressionParser parser = new SpelExpressionParser(); + + private DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer(); + + /** + * 鑾峰彇琛ㄨ揪鐨勫�� + * + * @param spELString + * @param joinPoint + * @return + */ + public String generateKeyBySpEL(String spELString, ProceedingJoinPoint joinPoint) { + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); + String[] paramNames = nameDiscoverer.getParameterNames(methodSignature.getMethod()); + Expression expression = parser.parseExpression(spELString); + EvaluationContext context = new StandardEvaluationContext(); + Object[] args = joinPoint.getArgs(); + for (int i = 0; i < args.length; i++) { + context.setVariable(paramNames[i], args[i]); + } + return expression.getValue(context).toString(); + } + + @Around("execution(public * com.yeshi.fanli.controller.client.*.*.*(..))") + public Object requestSerializable(ProceedingJoinPoint joinPoint) throws Throwable { Signature signature = joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method targetMethod = methodSignature.getMethod(); @@ -41,65 +70,71 @@ try { Method realMethod = joinPoint.getTarget().getClass().getDeclaredMethod(joinPoint.getSignature().getName(), targetMethod.getParameterTypes()); + Object[] args = joinPoint.getArgs(); + PrintWriter out = null; + String[] strings = methodSignature.getParameterNames(); + Map<String, ParamsTypeValue> map = new HashMap<>(); + Class<?>[] types = methodSignature.getParameterTypes(); + for (int i = 0; i < strings.length; i++) { + map.put(strings[i], new ParamsTypeValue(types[i], args[i])); + if (args[i] instanceof PrintWriter) { + out = (PrintWriter) args[i]; + } + } if (realMethod.isAnnotationPresent(RequestSerializableByKey.class)) { RequestSerializableByKey rs = realMethod.getAnnotation(RequestSerializableByKey.class); - String[] strings = methodSignature.getParameterNames(); - Class<?>[] types = methodSignature.getParameterTypes(); - Map<String, ParamsTypeValue> map = new HashMap<>(); - Object[] args = joinPoint.getArgs(); - PrintWriter out = null; - for (int i = 0; i < strings.length; i++) { - map.put(strings[i], new ParamsTypeValue(types[i], args[i])); - if (args[i] instanceof PrintWriter) { - out = (PrintWriter) args[i]; - } - } + String key = rs.key(); - ParamsTypeValue tv = null; - if (key.indexOf(".") > -1) { - tv = map.get(key.split("\\.")[0]); - } else { - tv = map.get(key); - } - Object value = tv.value; - Class<?> type = tv.type; - // 鏆傛椂鍙敮鎸�2灞傚祵濂� - if (key.indexOf(".") > -1) { - String child = key.split("\\.")[1]; - try { - Field f = type.getDeclaredField(child); - f.setAccessible(true); - Object obj = f.get(value); - if (obj != null) { - cacheKey = obj.toString(); - } - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); - } + cacheKey = generateKeyBySpEL(key, joinPoint); - } else { - if (value != null) { - cacheKey = value.toString(); - } - } + try {// redis鍋氬師瀛愭�т繚鎶� + if (!StringUtil.isNullOrEmpty(cacheKey)) { + cacheKey = joinPoint.getTarget().getClass().getName() + "." + targetMethod.getName() + "-" + + cacheKey; + String cacheAlias = cacheKey; + cacheKey = "rs-" + StringUtil.Md5(cacheKey); + // jiedis鍘熷瓙鎬у仛鎷︽埅 + Jedis jedis = jedisPool.getResource(); + long threadId = Thread.currentThread().getId(); + try { + Constant.waitingThreadSet.add(threadId); + String result = null; + long startTime = System.currentTimeMillis(); + // 绛夊緟鍝嶅簲 + while (StringUtil.isNullOrEmpty(result)) { - if (!StringUtil.isNullOrEmpty(cacheKey)) { - cacheKey = joinPoint.getTarget().getClass().getName() + "." + targetMethod.getName() + "-" - + cacheKey; - Cache cache = cacheManager.getCache("rsCache"); - ValueWrapper element = cache.get(cacheKey); - if (element != null && element.get() != null) { - // 鏈嶅姟鍣ㄧ箒蹇� - if (out != null) { - out.print(JsonUtil.loadFalseResult(2001, "鏈嶅姟鍣ㄧ箒蹇�")); + result = jedis.set(cacheKey, "1", new SetParams().nx().ex(30)); + if (StringUtil.isNullOrEmpty(result)) { + try { + Thread.sleep(50); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if (System.currentTimeMillis() - startTime > 1000 * 30L) { + Constant.waitingThreadSet.remove(Thread.currentThread().getId()); + out.print(JsonUtil.loadFalseResult("杩炴帴瓒呮椂")); + return null; + } + } else { + break; + } + } + + if (!StringUtil.isNullOrEmpty(result)) { + try { + return joinPoint.proceed(); + } finally { + jedis.del(cacheKey); + Constant.waitingThreadSet.remove(Thread.currentThread().getId()); + } + } + } finally { + jedis.close(); } - return null; - } else { - cache.put(cacheKey, "1"); } + } catch (Exception e) {// 鍘熷瓙鎬т繚鎶ゅ嚭閿� + return joinPoint.proceed(); } } @@ -113,20 +148,20 @@ return joinPoint.proceed(); } catch (Throwable e) { e.printStackTrace(); - try { + if (!Constant.IS_TEST) LogHelper.errorDetailInfo(e); - } catch (Exception e1) { - e1.printStackTrace(); - } + else + throw e; } finally { - if (!StringUtil.isNullOrEmpty(cacheKey)) { - Cache cache = cacheManager.getCache("rsCache"); - cache.put(cacheKey, null); - } } return null; } + // 娴嬭瘯浠g爜 + public void test() { + + } + class ParamsTypeValue { Class<?> type; Object value; -- Gitblit v1.8.0