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