diff --git a/mars-core/pom.xml b/mars-core/pom.xml index 2e64d5d..1cf8d97 100644 --- a/mars-core/pom.xml +++ b/mars-core/pom.xml @@ -5,7 +5,7 @@ com.github.yuyenews Mars - 3.0.15-HOTFIX + 3.0.16 mars-core diff --git a/mars-core/src/main/java/com/mars/aop/proxy/MarsBeanProxy.java b/mars-core/src/main/java/com/mars/aop/proxy/MarsBeanProxy.java index a75bfc3..6782a11 100644 --- a/mars-core/src/main/java/com/mars/aop/proxy/MarsBeanProxy.java +++ b/mars-core/src/main/java/com/mars/aop/proxy/MarsBeanProxy.java @@ -1,6 +1,7 @@ package com.mars.aop.proxy; import java.lang.reflect.Method; +import java.util.UUID; import com.mars.aop.proxy.exec.ExecAop; import com.mars.aop.proxy.exec.ExecRedisLock; @@ -47,6 +48,8 @@ public class MarsBeanProxy implements MethodInterceptor { AopModel tractionModel = null; RedisLock redisLock = null; Boolean hasLock = false; + /* 分布式锁,解锁时的标识 */ + String val = UUID.randomUUID().toString(); try { MarsAop marsAop = method.getAnnotation(MarsAop.class); @@ -56,9 +59,8 @@ public class MarsBeanProxy implements MethodInterceptor { tractionModel = ExecTraction.getAopModel(traction); aopModel = ExecAop.getAopModel(marsAop); - /* 加分布式锁 */ - hasLock = ExecRedisLock.lock(redisLock); + hasLock = ExecRedisLock.lock(redisLock,val); if(!hasLock){ return null; } @@ -85,10 +87,10 @@ public class MarsBeanProxy implements MethodInterceptor { ExecAop.exp(aopModel, e); throw e; } finally { - /* 解分布式锁, 如果失败了就重试,十次之后还失败,就不管了,20秒后会自动解锁 */ + /* 解分布式锁, 如果失败了就重试,十次之后还失败,就不管了,10秒后会自动解锁 */ if(hasLock){ for(int i = 0;i<10;i++){ - Boolean hasUnlock = ExecRedisLock.unlock(redisLock); + Boolean hasUnlock = ExecRedisLock.unlock(redisLock,val); if(hasUnlock){ break; } diff --git a/mars-core/src/main/java/com/mars/aop/proxy/exec/ExecRedisLock.java b/mars-core/src/main/java/com/mars/aop/proxy/exec/ExecRedisLock.java index 81a6a33..2e92581 100644 --- a/mars-core/src/main/java/com/mars/aop/proxy/exec/ExecRedisLock.java +++ b/mars-core/src/main/java/com/mars/aop/proxy/exec/ExecRedisLock.java @@ -28,56 +28,63 @@ public class ExecRedisLock { /** * 加锁 + * * @param redisLock 注解 + * @param value 值 * @return 加锁结果 */ - public static Boolean lock(RedisLock redisLock) { - return exec(redisLock,"lock"); + public static Boolean lock(RedisLock redisLock, String value) { + return exec(redisLock, value, "lock"); } /** * 解锁 + * * @param redisLock 注解 + * @param value 值 * @return 解锁结果 */ - public static Boolean unlock(RedisLock redisLock) { - return exec(redisLock,"unlock"); + public static Boolean unlock(RedisLock redisLock, String value) { + return exec(redisLock, value, "unlock"); } /** * 执行加解锁操作 - * @param redisLock 注解 + * + * @param redisLock 注解 + * @param value 值 * @param methodName 执行的方法 * @return 结果 */ - private static Boolean exec(RedisLock redisLock,String methodName) { + private static Boolean exec(RedisLock redisLock, String value, String methodName) { try { - if(redisLock == null){ + if (redisLock == null) { /* 这个true代表不需要加解锁,为了让程序继续往下走 */ return true; } redisLockClass = getRedisLockClass(); redisLockObj = getRedisLockObj(); - Method method = redisLockClass.getMethod(methodName,new Class[]{String.class}); - Object result = method.invoke(redisLockObj,new Object[]{redisLock.key()}); - if(result == null){ + Method method = redisLockClass.getMethod(methodName, new Class[]{String.class, String.class}); + Object result = method.invoke(redisLockObj, new Object[]{redisLock.key(), value}); + if (result == null) { return false; } return Boolean.parseBoolean(result.toString()); - } catch (Exception e){ - logger.error("分布式锁出现异常["+methodName+"]",e); + } catch (Exception e) { + logger.error("分布式锁出现异常[" + methodName + "]", e); return false; } } /** * 获取分布式锁的class对象 + * * @return 分布式锁的class对象 * @throws Exception 异常 */ private static Class getRedisLockClass() throws Exception { /* 这里只是为了节约性能,在首次并发的情况下,即使执行了多次,也不会存在安全问题 */ - if(redisLockClass == null) { + if (redisLockClass == null) { redisLockClass = Class.forName("com.mars.redis.lock.MarsRedisLock"); } return redisLockClass; @@ -85,13 +92,14 @@ public class ExecRedisLock { /** * 获取分布式锁的实例对象 + * * @return 分布式锁的实例对象 * @throws Exception 异常 */ private static Object getRedisLockObj() throws Exception { /* 这里只是为了节约性能,在首次并发的情况下,即使执行了多次,也不会存在安全问题 */ - if(redisLockObj == null) { - redisLockObj = BeanFactory.getBean("marsRedisLock",Object.class); + if (redisLockObj == null) { + redisLockObj = BeanFactory.getBean("marsRedisLock", Object.class); } return redisLockObj; } diff --git a/mars-jdbc/pom.xml b/mars-jdbc/pom.xml index b893c83..681f7d6 100644 --- a/mars-jdbc/pom.xml +++ b/mars-jdbc/pom.xml @@ -5,7 +5,7 @@ Mars com.github.yuyenews - 3.0.15-HOTFIX + 3.0.16 4.0.0 mars-jdbc diff --git a/mars-mvc/pom.xml b/mars-mvc/pom.xml index 434456e..cb2ca3a 100644 --- a/mars-mvc/pom.xml +++ b/mars-mvc/pom.xml @@ -5,7 +5,7 @@ com.github.yuyenews Mars - 3.0.15-HOTFIX + 3.0.16 mars-mvc diff --git a/mars-redis/pom.xml b/mars-redis/pom.xml index 14ed12a..55a9163 100644 --- a/mars-redis/pom.xml +++ b/mars-redis/pom.xml @@ -5,7 +5,7 @@ Mars com.github.yuyenews - 3.0.15-HOTFIX + 3.0.16 4.0.0 diff --git a/mars-redis/src/main/java/com/mars/redis/lock/MarsRedisLock.java b/mars-redis/src/main/java/com/mars/redis/lock/MarsRedisLock.java index dcc77f0..9cdab2a 100644 --- a/mars-redis/src/main/java/com/mars/redis/lock/MarsRedisLock.java +++ b/mars-redis/src/main/java/com/mars/redis/lock/MarsRedisLock.java @@ -22,51 +22,53 @@ public class MarsRedisLock { /** * 加锁,使用框架上配置的redis - * @param key 键 + * + * @param key 键 + * @param value 值 * @return */ - public boolean lock(String key){ + public boolean lock(String key, String value) { try { ShardedJedis shardedJedis = marsRedisTemplate.getShardedJedis(); - return lock(key ,shardedJedis); - } catch (Exception e){ - logger.error("获取redis锁发生异常",e); + return lock(key, value, shardedJedis); + } catch (Exception e) { + logger.error("获取redis锁发生异常", e); return false; } } /** * 加锁,使用你自己创建的jedis对象 - * @param key 键 + * + * @param key 键 + * @param value 值 * @param shardedJedis 自己创建的jedis对象 * @return */ - public boolean lock(String key, ShardedJedis shardedJedis){ + public boolean lock(String key, String value, ShardedJedis shardedJedis) { try { - if(shardedJedis == null){ + if (shardedJedis == null) { return false; } int count = 0; - String value = "lock"; - SetParams params = SetParams.setParams().nx().px(20000); - String result = shardedJedis.set(key,value,params); - - while(result == null || !result.toUpperCase().equals("OK")){ + SetParams params = SetParams.setParams().nx().px(5000); + String result = shardedJedis.set(key, value, params); + while (result == null || !result.toUpperCase().equals("OK")) { /* 如果设置失败,代表这个key已经存在了,也就说明锁被占用了,则进入等待 */ - Thread.sleep(2000); - if(count >= 9){ - /* 20秒后还没有获取锁,则停止等待 */ + Thread.sleep(500); + if (count >= 19) { + /* 10秒后还没有获取锁,则停止等待 */ return false; } - result = shardedJedis.set(key,value,params); + result = shardedJedis.set(key, value, params); count++; } return true; - } catch (Exception e){ - logger.error("获取redis锁发生异常",e); + } catch (Exception e) { + logger.error("获取redis锁发生异常", e); return false; } finally { marsRedisTemplate.recycleJedis(shardedJedis); @@ -75,31 +77,38 @@ public class MarsRedisLock { /** * 释放锁,使用框架上配置的redis - * @param key 键 + * + * @param key 键 + * @param value 值 * @return */ - public boolean unlock(String key){ + public boolean unlock(String key, String value) { try { ShardedJedis shardedJedis = marsRedisTemplate.getShardedJedis(); - return unlock(key ,shardedJedis); - } catch (Exception e){ - logger.error("释放redis锁发生异常",e); + return unlock(key, value, shardedJedis); + } catch (Exception e) { + logger.error("释放redis锁发生异常", e); return false; } } /** * 释放锁,使用你自己创建的jedis对象 - * @param key 键 + * + * @param key 键 + * @param value 值 * @param shardedJedis 自己创建的jedis对象 * @return */ - public boolean unlock(String key, ShardedJedis shardedJedis){ + public boolean unlock(String key, String value, ShardedJedis shardedJedis) { try { - if(shardedJedis == null){ + if (shardedJedis == null) { return false; } - shardedJedis.del(key); + String val = shardedJedis.get(key); + if (val != null && val.equals(value)) { + shardedJedis.del(key); + } return true; } catch (Exception e) { logger.error("释放redis锁发生异常", e); diff --git a/mars-server/pom.xml b/mars-server/pom.xml index 317e7b9..170e65f 100644 --- a/mars-server/pom.xml +++ b/mars-server/pom.xml @@ -5,7 +5,7 @@ com.github.yuyenews Mars - 3.0.15-HOTFIX + 3.0.16 mars-server diff --git a/mars-starter/pom.xml b/mars-starter/pom.xml index a0fe64c..c88d0f1 100644 --- a/mars-starter/pom.xml +++ b/mars-starter/pom.xml @@ -6,7 +6,7 @@ Mars com.github.yuyenews - 3.0.15-HOTFIX + 3.0.16 mars-starter diff --git a/mars-tomcat/pom.xml b/mars-tomcat/pom.xml index b4c2f5c..e736168 100644 --- a/mars-tomcat/pom.xml +++ b/mars-tomcat/pom.xml @@ -5,7 +5,7 @@ com.github.yuyenews Mars - 3.0.15-HOTFIX + 3.0.16 mars-tomcat diff --git a/pom.xml b/pom.xml index 37b0af6..1b790c1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.github.yuyenews Mars - 3.0.15-HOTFIX + 3.0.16 pom mars-core