WANG 5 vuotta sitten
vanhempi
commit
a90b3728bf

+ 9 - 1
src/main/java/cn/com/qmth/examcloud/web/helpers/SequenceLockHelper.java

@@ -13,6 +13,7 @@ import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
 import cn.com.qmth.examcloud.commons.util.ThreadLocalUtil;
 import cn.com.qmth.examcloud.web.enums.HttpServletRequestAttribute;
 import cn.com.qmth.examcloud.web.exception.SequenceLockException;
+import cn.com.qmth.examcloud.web.interceptor.SeqlockInterceptor;
 import cn.com.qmth.examcloud.web.redis.RedisClient;
 import cn.com.qmth.examcloud.web.support.ServletUtil;
 import cn.com.qmth.examcloud.web.support.SpringContextHolder;
@@ -51,7 +52,9 @@ public class SequenceLockHelper {
 
 		String key = LOCK_PREFIX + StringUtils.join(Arrays.asList(args), "_");
 
-		if (getRedisClient().setIfAbsent(key, ThreadLocalUtil.getTraceId(), 60 * 5)) {
+		int timeout = 60 * 2;
+
+		if (getRedisClient().setIfAbsent(key, ThreadLocalUtil.getTraceId(), timeout)) {
 			if (LOG.isDebugEnabled()) {
 				LOG.debug("locked");
 			}
@@ -65,6 +68,11 @@ public class SequenceLockHelper {
 			ServletUtil.getRequest().setAttribute(
 					HttpServletRequestAttribute.$_CUSTOM_SEQUENCE_LOCK.name(), keyList);
 		} else {
+			Long expire = getRedisClient().getExpire(key, TimeUnit.SECONDS);
+			if (null == expire || expire > timeout) {
+				getRedisClient().delete(key);
+			}
+
 			throw new SequenceLockException("请求等待,请稍后重试!");
 		}
 	}

+ 10 - 0
src/main/java/cn/com/qmth/examcloud/web/redis/RedisClient.java

@@ -114,4 +114,14 @@ public interface RedisClient {
 	 */
 	public Boolean setIfAbsent(String key, String value, int timeout);
 
+	/**
+	 * 获取失效时间
+	 *
+	 * @author WANGWEI
+	 * @param key
+	 * @param timeUnit
+	 * @return
+	 */
+	public Long getExpire(String key, TimeUnit timeUnit);
+
 }

+ 5 - 0
src/main/java/cn/com/qmth/examcloud/web/redis/SimpleRedisClient.java

@@ -141,4 +141,9 @@ public final class SimpleRedisClient implements RedisClient {
 		this.enable = enable;
 	}
 
+	@Override
+	public Long getExpire(String key, TimeUnit timeUnit) {
+		return redisTemplate.getExpire(key, timeUnit);
+	}
+
 }