RuoyiCloudPlus中使用分布式锁Lock4j

news/2024/11/7 4:47:56/

Lock4j支持Redisson,RedisTemplate,zookeeper。

 在ruoyi-common-redis模块的pom中可以看到本项目中使用的方式是基于redssion的,redission支持的锁很多,lock4j继承了其中的可重入锁:

在application-common.yml中可以看到lock4j的全局配置:

acquire-timeout:获取分布式锁超时时间,默认为 3000 毫秒

expire: 分布式锁的超时时间,默认为 30 秒 

获取锁超时:比如发生死锁时,防止其他线程长时间等待。

分布式锁的超时时间:发生网络抖动(释放锁的一瞬断网了)以及Redis宕机。通常Ression自带的看门狗功能会自动审视过期时间内程序是否执行完。

通过默认配置,我们可以仅通过一个@Lock4j注解来实现分布式锁:

SysTenantController#add

demo中有一个专门用于测试锁的controller类:RedisLockController

里面分别介绍了两种lock4j的使用方式:注解的使用与LockTemplate的使用,原理和执行过程是一样的,前者方便,后者灵活,都是通过传递一个Key作为锁,只要Key一致,则表示为一把锁,需要竞争。

package org.dromara.demo.controller;import com.baomidou.lock.LockInfo;
import com.baomidou.lock.LockTemplate;
import com.baomidou.lock.annotation.Lock4j;
import com.baomidou.lock.executor.RedissonLockExecutor;
import org.dromara.common.core.domain.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.time.LocalTime;/*** 测试分布式锁的样例** @author shenxinquan*/
@Slf4j
@RestController
@RequestMapping("/redisLock")
public class RedisLockController {@Autowiredprivate LockTemplate lockTemplate;/*** 测试lock4j 注解* acquireTimeout:获取分布式锁超时时间,默认为 3000 毫秒* expire:分布式锁的超时时间*/@Lock4j(keys = {"#key"},acquireTimeout = 5000L,expire = 30000L)@GetMapping("/testLock4j")public R<String> testLock4j(String key, String value) {System.out.println("start:" + key + ",time:" + LocalTime.now());try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("end :" + key + ",time:" + LocalTime.now());return R.ok("操作成功", value);}/*** 测试lock4j 工具*/@GetMapping("/testLock4jLockTemplate")public R<String> testLock4jLockTemplate(String key, String value) {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);}//结束return R.ok("操作成功", value);}}

可以在GlobalExceptionHandler中配置获取锁超时的异常处理

@ExceptionHandler(DemoModeException.class)public R<Void> handleLockException(LockFailureException e) {return R.fail("获取锁失败");}

也可以参考lock4j源码中提供的案例实现:

package org.dromara.demo.exception;import com.baomidou.lock.LockFailureStrategy;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.exception.ServiceException;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;/*** 自定义获取锁异常处理** @author zengzhihong*/
@Slf4j
@Component
public class CustomLockFailureStrategy implements LockFailureStrategy {@Overridepublic void onLockFailure(String key, Method method, Object[] arguments) {log.error("获取锁失败了,key={},method={},arguments={}", key, method, arguments);// 此处可以抛出指定异常,配合全局异常拦截包装统一格式返回给调用端throw new ServiceException("请求太快啦~");}
}

 

 


http://www.ppmy.cn/news/634430.html

相关文章

C语言的##使用

##在C/C中具有连接字符串的作用 #include<stdio.h> #define TEST(_name, _inst_alloc) \printf("token6 %d\n",_name##_inst_alloc); int main() {int token6 100;TEST(token, 6);return 0; }

站长工具:快速对比PHP环境组件插件支持情况

我们使用国内主流宝塔护卫神等PHP环境或虚拟主机或许不会遇到本困惑&#xff0c;但当前越多的人使用容器等&#xff0c;那么就需要我们快速对比环境差别&#xff0c;就用到以下PHP代码&#xff1a; <style> form{display:flex;} textarea{flex: 5;min-width:312px; heig…

快车轶事-安全带

昨天打车特别艰难&#xff0c;网约车平台建议我拼车下试试&#xff0c;单独叫车还需要等待120个人&#xff0c;拼车前面只有5个人了&#xff0c;选择拼车会节省60分钟&#xff0c;我想了想&#xff0c;提示有道理&#xff0c;决定试试拼车。 果然拼车先派发到我这里&#xff0c…

Linux--ls指令

一、ls是list的简写 二、语法&#xff1a; ls [选项][目录或文件] 三、功能&#xff1a; ①对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。 ②对于文件&#xff0c;将列出文件名以及其他信息。 四、常用选项&#xff1a; 1.-a 列出目录下的所有文件&#…

快狗打车年营收7.7亿:同比增17% 经调整亏损2亿

雷递网 乐天 3月27日 快狗打车控股有限公司&#xff08;简称&#xff1a;“快狗打车”&#xff0c;股票代码为&#xff1a;“2246”&#xff09;日前发布财报。财报显示&#xff0c;快狗打车2022年营收为7.73亿元&#xff0c;较上年同期的6.6亿元增长17%。 快狗打车2022年毛利实…

您的滴滴2020年度出行报告,请查收!

桔妹导读&#xff1a;滴滴2020年度出行盘点新鲜出炉&#xff0c;每个人都有属于自己的滴滴之城&#xff0c;快来看看你的城。打玉人、Tony的亲人、最该呵护的人……这12种有趣的灵魂&#xff0c;你是哪一种&#xff1f; 一年一度的个人出行盘点新鲜出炉 你的最晚一单 是不是还是…

滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(3月19日)...

滴快车单单2.5倍&#xff0c;注册地址&#xff1a;http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单&#xff1a;http://www.cnblogs.com/mfryf/p/4612609.html 优步奖励低/不挣钱/怎么办?看这里&#xff1a;http://www.cnblogs.com/mfry…

滴滴抢单功能实现_滴滴打车系统模式开发 类似滴滴快车抢单模式开发

滴滴打车系统模式举例介绍&#xff1a; 一、滴滴快车抢单模式火了&#xff0c;各行各业开始效仿 从使用滴滴打车、货拉拉等软件的用户量来看&#xff0c;滴滴、货拉拉真的很火&#xff0c;植入预约抢单、预约派单功能的分享经济模式开始备受青睐&#xff0c;很多企业开始效仿。…