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