From 645c926bbd52baa90c0a4af0d253047709c5e02c Mon Sep 17 00:00:00 2001
From: sxq <812980466@qq.com>
Date: 星期二, 22 六月 2021 16:06:02 +0800
Subject: [PATCH] 集成lock4j框架,删除redisson锁,使用lock4j的锁。

---
 /dev/null                                                                     |  137 ---------------------------
 ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java |   43 ++++++++
 pom.xml                                                                       |    7 +
 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java   |   52 +++-------
 ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java         |    5 +
 ruoyi-common/pom.xml                                                          |    5 +
 6 files changed, 75 insertions(+), 174 deletions(-)

diff --git a/pom.xml b/pom.xml
index 877a396..5fe335a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,6 +30,7 @@
         <feign-okhttp.version>11.0</feign-okhttp.version>
         <spring-boot-admin.version>2.4.1</spring-boot-admin.version>
         <redisson.version>3.15.2</redisson.version>
+        <lock4j.version>2.2.1</lock4j.version>
         <datasource.version>3.4.0</datasource.version>
     </properties>
 
@@ -133,7 +134,11 @@
                 <artifactId>redisson-spring-boot-starter</artifactId>
                 <version>${redisson.version}</version>
             </dependency>
-
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
+                <version>${lock4j.version}</version>
+            </dependency>
             <!-- 瀹氭椂浠诲姟-->
             <dependency>
                 <groupId>com.ruoyi</groupId>
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 39c7b8e..e2cbd39 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -152,6 +152,11 @@
             <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RedisLock.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RedisLock.java
deleted file mode 100644
index 7b3c912..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RedisLock.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.ruoyi.common.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 鍒嗗竷寮忛攣锛堟敞瑙fā寮忥紝涓嶆帹鑽愪娇鐢紝鏈�濂界敤閿佺殑宸ュ叿绫伙級
- *
- * @author shenxinquan
- */
-
-@Target({ElementType.METHOD})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface RedisLock {
-
-	/**
-	 * 閿佽繃鏈熸椂闂� 榛樿30绉�
-	 */
-	int expireTime() default 30;
-
-	/**
-	 * 閿乲ey鍊�
-	 */
-	String key() default "redisLockKey";
-}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java
index c3c71ef..b872a5f 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java
@@ -1,16 +1,14 @@
 package com.ruoyi.demo.controller;
 
-import com.ruoyi.common.annotation.RedisLock;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.redis.RedisLockManager;
+import com.ruoyi.demo.service.ITestDemoService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
-
-import java.util.concurrent.TimeUnit;
 
 
 /**
@@ -24,45 +22,27 @@
 public class RedisLockController {
 
 	@Autowired
-	private RedisLockManager redisLockManager;
+	private ITestDemoService testDemoService;
 
 	/**
-	 * #p0 鏍囪瘑鍙栫涓�涓弬鏁颁负redis閿佺殑key
+	 * 娴嬭瘯lock4j
+	 * @param key
+	 * @param value
+	 * @return
 	 */
-	@GetMapping("/testLock1")
-	@RedisLock(expireTime = 10, key = "#p0")
-	public AjaxResult<String> testLock1(String key, String value) {
-		try {
-			// 鍚屾椂璇锋眰鎺掗槦
-//			Thread.sleep(5000);
-			// 閿佽秴鏃舵祴璇�
-			Thread.sleep(11000);
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
+	@GetMapping("/testLock4j")
+	public  AjaxResult<String> testLock4j(String key,String value){
+		testDemoService.testLock4j(key);
+		return AjaxResult.success("鎿嶄綔鎴愬姛",value);
+	}
+	@GetMapping("/testLock4jLockTemaplate")
+	public  AjaxResult<String> testLock4jLockTemaplate(String key,String value){
+		testDemoService.testLock4jLockTemaplate(key);
 		return AjaxResult.success("鎿嶄綔鎴愬姛",value);
 	}
 
-	/**
-	 * 娴嬭瘯閿佸伐鍏风被
-	 */
-	@GetMapping("/testLock2")
-	public AjaxResult<Void> testLock(String key, Long time) {
-		try {
-			boolean flag = redisLockManager.getLock(key, time, TimeUnit.SECONDS);
-			if (flag) {
-				log.info("鑾峰彇閿佹垚鍔�: " + key);
-				Thread.sleep(3000);
-				redisLockManager.unLock(key);
-				log.info("閲婃斁閿佹垚鍔�: " + key);
-			} else {
-				log.error("鑾峰彇閿佸け璐�: " + key);
-			}
-		} catch (InterruptedException e) {
-			log.error(e.getMessage());
-		}
-		return AjaxResult.success();
-	}
+
+
 
 	/**
 	 * 娴嬭瘯spring-cache娉ㄨВ
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java
index 3ab87ef..36f300c 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java
@@ -18,6 +18,11 @@
  * @date 2021-05-30
  */
 public interface ITestDemoService extends IServicePlus<TestDemo> {
+
+	void testLock4j(String key);
+
+	void testLock4jLockTemaplate(String key);
+
 	/**
 	 * 鏌ヨ鍗曚釜
 	 * @return
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java
index 75f5232..8d80e39 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java
@@ -2,6 +2,10 @@
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.lock.LockInfo;
+import com.baomidou.lock.LockTemplate;
+import com.baomidou.lock.annotation.Lock4j;
+import com.baomidou.lock.executor.RedissonLockExecutor;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.annotation.DataScope;
@@ -18,8 +22,10 @@
 import com.ruoyi.demo.mapper.TestDemoMapper;
 import com.ruoyi.demo.service.ITestDemoService;
 import com.ruoyi.demo.vo.TestDemoVo;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalTime;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -33,6 +39,43 @@
 @Service
 public class TestDemoServiceImpl extends ServicePlusImpl<TestDemoMapper, TestDemo> implements ITestDemoService {
 
+
+	@Autowired
+	private LockTemplate lockTemplate;
+
+	@Override
+	public void testLock4jLockTemaplate(String key) {
+		final LockInfo lockInfo = lockTemplate.lock(key, 30000L, 5000L, RedissonLockExecutor.class);
+		if (null == lockInfo) {
+			throw new RuntimeException("涓氬姟澶勭悊涓�,璇风◢鍚庡啀璇�");
+		}
+		// 鑾峰彇閿佹垚鍔燂紝澶勭悊涓氬姟
+		try {
+			try {
+				Thread.sleep(8000);
+			} catch (InterruptedException e) {
+				//
+			}
+		 System.out.println("鎵ц绠�鍗曟柟娉�1 , 褰撳墠绾跨▼:" + Thread.currentThread().getName());
+		} finally {
+			//閲婃斁閿�
+			lockTemplate.releaseLock(lockInfo);
+		}
+		//缁撴潫
+	}
+
+	@Override
+	@Lock4j(executor = RedissonLockExecutor.class,keys = {"#key"})
+	public void testLock4j(String key) {
+		System.out.println("start:"+key+",time:"+LocalTime.now().toString());
+		try {
+			Thread.sleep(10000);
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+		System.out.println("end :"+key+",time:"+LocalTime.now().toString());
+	}
+
 	@Override
 	public TestDemoVo queryById(Long id) {
 		return getVoById(id, TestDemoVo.class);
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RedisLockAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RedisLockAspect.java
deleted file mode 100644
index efe628f..0000000
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RedisLockAspect.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package com.ruoyi.framework.aspectj;
-
-
-import com.ruoyi.common.annotation.RedisLock;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.core.redis.RedisLockManager;
-import lombok.extern.slf4j.Slf4j;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
-import org.aspectj.lang.reflect.MethodSignature;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * 鍒嗗竷寮忛攣锛堟敞瑙e疄鐜扮増鏈級
- *
- * @author shenxinquan
- */
-
-@Slf4j
-@Aspect
-@Order(9)
-@Component
-public class RedisLockAspect {
-
-	@Autowired
-	private RedisLockManager redisLockManager;
-
-	@Pointcut("@annotation(com.ruoyi.common.annotation.RedisLock)")
-	public void annotationPointcut() {
-	}
-
-	@Around("annotationPointcut()")
-	public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
-		// 鑾峰緱褰撳墠璁块棶鐨刢lass
-		Class<?> className = joinPoint.getTarget().getClass();
-		// 鑾峰緱璁块棶鐨勬柟娉曞悕
-		String methodName = joinPoint.getSignature().getName();
-		// 寰楀埌鏂规硶鐨勫弬鏁扮殑绫诲瀷
-		Class<?>[] argClass = ((MethodSignature) joinPoint.getSignature()).getParameterTypes();
-		Object[] args = joinPoint.getArgs();
-		String key = "";
-		// 榛樿30绉掕繃鏈熸椂闂�
-		int expireTime = 30;
-
-		try {
-			// 寰楀埌璁块棶鐨勬柟娉曞璞�
-			Method method = className.getMethod(methodName, argClass);
-			method.setAccessible(true);
-			// 鍒ゆ柇鏄惁瀛樺湪@RedisLock娉ㄨВ
-			if (method.isAnnotationPresent(RedisLock.class)) {
-				RedisLock annotation = method.getAnnotation(RedisLock.class);
-				key = getRedisKey(args, annotation.key());
-				expireTime = getExpireTime(annotation);
-			}
-		} catch (Exception e) {
-			throw new RuntimeException("redis鍒嗗竷寮忛攣娉ㄨВ鍙傛暟寮傚父", e);
-		}
-
-		// 澹版槑閿佸悕绉�
-		key = Constants.REDIS_LOCK_KEY + key;
-		Object res;
-		try {
-			if (redisLockManager.getLock(key, expireTime, TimeUnit.SECONDS)) {
-				log.info("lock => key : " + key + " , ThreadName : " + Thread.currentThread().getName());
-				try {
-					res = joinPoint.proceed();
-					return res;
-				} catch (Exception e) {
-					throw new RuntimeException(e);
-				} finally {
-					redisLockManager.unLock(key);
-					log.info("unlock => key : " + key + " , ThreadName : " + Thread.currentThread().getName());
-				}
-			} else {
-				throw new RuntimeException("redis鍒嗗竷寮忛攣娉ㄨВ鍙傛暟寮傚父");
-			}
-		} catch (IllegalMonitorStateException e) {
-			log.error("lock timeout => key : " + key + " , ThreadName : " + Thread.currentThread().getName());
-			throw new RuntimeException("lock timeout => key : " + key);
-		} catch (Exception e) {
-			throw new Exception("redis鍒嗗竷寮忔湭鐭ュ紓甯�", e);
-		}
-	}
-
-	private int getExpireTime(RedisLock annotation) {
-		return annotation.expireTime();
-	}
-
-	private String getRedisKey(Object[] args, String primalKey) {
-		if (args.length == 0) {
-			return primalKey;
-		}
-		// 鑾峰彇#p0...闆嗗悎
-		List<String> keyList = getKeyParsList(primalKey);
-		for (String keyName : keyList) {
-			int keyIndex = Integer.parseInt(keyName.toLowerCase().replace("#p", ""));
-			Object parValue = args[keyIndex];
-			primalKey = primalKey.replace(keyName, String.valueOf(parValue));
-		}
-		return primalKey.replace("+", "").replace("'", "");
-	}
-
-	/**
-	 * 鑾峰彇key涓�#p0涓殑鍙傛暟鍚嶇О
-	 */
-	private static List<String> getKeyParsList(String key) {
-		List<String> listPar = new ArrayList<>();
-		if (key.contains("#")) {
-			int plusIndex = key.substring(key.indexOf("#")).indexOf("+");
-			int indexNext = 0;
-			String parName;
-			int indexPre = key.indexOf("#");
-			if (plusIndex > 0) {
-				indexNext = key.indexOf("#") + plusIndex;
-				parName = key.substring(indexPre, indexNext);
-			} else {
-				parName = key.substring(indexPre);
-			}
-			listPar.add(parName.trim());
-			key = key.substring(indexNext + 1);
-			if (key.contains("#")) {
-				listPar.addAll(getKeyParsList(key));
-			}
-		}
-		return listPar;
-	}
-
-}

--
Gitblit v1.9.3