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