(相关资料图)
在此之前,去看了下Redission的实现原理,不过在开发中,原本的代码使用RedistTemplate实现的,也不太想换,所以我想了下,不如自己实现要给WatchDog。
我的想法是,在用户加上锁的时候开启个定时任务线程,并且在定时任务中,判断原线程isAlive状态进行“续命”。
下面是代码(在这里面为了方便,未使用的是HuTool.CornUtil来实现动态定时任务):
/** * Title * * @ClassName: LockUtil * @Description:锁工具类,通过内部枚举类实现单例,防止反射攻击 * @author: Karos * @date: 2023/1/4 0:17 * @Blog: https://www.wzl1.top/ */package cn.katool.lock;import cn.hutool.core.util.BooleanUtil;import cn.hutool.core.util.ObjectUtil;import cn.hutool.cron.CronUtil;import cn.hutool.cron.task.Task;import cn.katool.Config.LockConfig;import cn.katool.Exception.ErrorCode;import cn.katool.Exception.KaToolException;import cn.katool.other.MethodIntefaceUtil;import com.qiniu.util.StringUtils;import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Scope;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import org.springframework.util.ObjectUtils;import javax.annotation.Resource;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.TimeUnit;@Component@Scope("prototype")@Slf4jpublic class LockUtil { @Resource RedisTemplate redisTemplate; private LockUtil(){ } private static boolean isOpenCorn=false; /** * 带看门狗机制上锁 * @param lockObj * @return */ public boolean DistributedLock(Object lockObj){ try { return DistributedLock(lockObj,null,null); } catch (KaToolException e) { throw new RuntimeException(e); } } @Resource LockConfig lockConfig; //加锁 /** * 无看门狗机制上锁 * @param obj * @param exptime * @param timeUnit * @return * @throws KaToolException */ public boolean DistributedLock(Object obj,Long exptime,TimeUnit timeUnit) throws KaToolException { if (ObjectUtil.isEmpty(obj)){ throw new KaToolException(ErrorCode.PARAMS_ERROR," Lock=> 传入obj为空"); } Boolean isDelay=false; if (ObjectUtil.isAllEmpty(exptime,timeUnit)){ isDelay=true; } if(ObjectUtil.isEmpty(exptime)){ exptime= lockConfig.getInternalLockLeaseTime();; } if (ObjectUtils.isEmpty(timeUnit)){ timeUnit=lockConfig.getTimeUnit(); } //线程被锁住了,就一直等待 DistributedAssert(obj); Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("Lock:"+obj.toString(), "1", exptime, timeUnit); log.info("katool=> LockUntil => DistributedLock:{} value:{} extime:{} timeUnit:{}",obj.toString(), "1", exptime, timeUnit); //实现看门狗 if (isDelay){ if (LockUtil.isOpenCorn==false){ //如果同一个项目之前打开过,那么先关闭,避免重复启动 CronUtil.stop(); //支持秒级别定时任务 CronUtil.setMatchSecond(true); //定时服务启动 CronUtil.start(); LockUtil.isOpenCorn=true; } Thread thread = Thread.currentThread(); TimeUnit finalTimeUnit = timeUnit; Long finalExptime = exptime; class TempClass{ public String scheduleId; } final TempClass tempClass = new TempClass(); tempClass.scheduleId=CronUtil.schedule("0/30 * * * * ?", new Task() { @SneakyThrows @Override public void execute() { boolean alive = thread.isAlive(); if (alive) { delayDistributedLock(obj, finalExptime>=3?(finalExptime / 3):finalExptime, finalTimeUnit); return; } else { if (tempClass.scheduleId==null||"".equals(tempClass.scheduleId)){ return; } CronUtil.remove(tempClass.scheduleId); DistributedUnLock(obj); return; } } }); } return BooleanUtil.isTrue(aBoolean); } //检锁 public void DistributedAssert(Object obj) throws KaToolException { if (ObjectUtils.isEmpty(obj)){ throw new KaToolException(ErrorCode.PARAMS_ERROR," Lock=> 传入obj为空"); } while(true){ Object o = redisTemplate.opsForValue().get("Lock:" + obj.toString()); if (ObjectUtils.isEmpty(o))return; } } //延期 public boolean delayDistributedLock(Object obj,Long exptime,TimeUnit timeUnit) throws KaToolException { if (ObjectUtils.isEmpty(obj)){ throw new KaToolException(ErrorCode.PARAMS_ERROR," Lock=> 传入obj为空"); } Boolean aBoolean = redisTemplate.opsForValue().setIfPresent("Lock:"+obj.toString(), "1", exptime, timeUnit); log.info("katool=> LockUntil => delayDistributedLock:{} value:{} extime:{} timeUnit:{}",obj.toString(), "1", exptime, timeUnit); return BooleanUtil.isTrue(aBoolean); } //释放锁 public boolean DistributedUnLock(Object obj) throws KaToolException { if (ObjectUtils.isEmpty(obj)){ throw new KaToolException(ErrorCode.PARAMS_ERROR," Lock=> 传入obj为空"); } Boolean aBoolean = redisTemplate.delete("Lock:" + obj.toString()); log.info("katool=> LockUntil => unDistributedLock:{} isdelete:{} ",obj.toString(),true); return BooleanUtil.isTrue(aBoolean); } //利用枚举类实现单例模式,枚举类属性为静态的 private enum SingletonFactory{ Singleton; LockUtil lockUtil; private SingletonFactory(){ lockUtil=new LockUtil(); } public LockUtil getInstance(){ return lockUtil; } } @Bean("LockUtil") public static LockUtil getInstance(){ return SingletonFactory.Singleton.lockUtil; }}
关键词:
-
针对RedisTemplate分布式锁实现WatchDog 最资讯
在此之前,去看了下Redission的实现原理,不过在开发中,原本的代码使用RedistTemplate实现的,也不太想换,所以我想了下,不如自己实现要给Wat
-
欠滴水贷没还法院会强制执行吗
需要视情况而定。起诉后,法院判决还款不执行的,那法院就会采取强制执行。行动建议:1)正规网贷一定要还。蚂蚁花呗借呗、京东白条金条等都是
-
京宛两地专家联合开展健康进社区义诊活动
点击中国中医科学院望京医院|关注我们为充分发挥国家中医(骨伤)区域医疗中心服务平台的功能和作用,更好地学习贯彻党的二十大精神,持续推进
-
来自40万米高空的凝望!200余颗在轨遥感卫星守护“美丽中国”
今天(22日)是第54个世界地球日,这是一个专门为世界环境保护而设立的节日。近年来,我国不断加大生态修复力度,取得了显著成效。为了更直观
-
主力最害怕这种人:“500股补仓法”,跌5毛补500,涨5毛出500!
股市中发人深思的小故事故事的主人公是一只聪明的猴子,它从小就非常喜欢爬树。猴子总是想方设法地爬上高高的树顶,探索更广阔的世界。一天,
-
马斯克:“星舰”1-2个月内可准备再次发射
马斯克:“星舰”1-2个月内可准备再次发射,太空,星舰,发射架,星际飞船,埃隆_马斯克,spacex
-
英国女首相特拉斯辞职原因_英国女首相
1、1979年5月3日,玛格丽特·撒切尔成为欧洲第一个女首·相。2、在5月3日的英国大·选中,她和她
-
顺络电子2023年第一季度营收10.25亿 净利8054.58万 本期研发薪酬支出上涨 每日头条
挖贝网4月22日,顺络电子(002138)发布2023年第一季度报告,公告显示,2023年第一季度营业收入为1,024,
-
天天酷跑电脑版官网 天天酷跑积分版12_天天热议
今天来聊聊关于天天酷跑电脑版官网,天天酷跑积分版12的文章,现在就为大家来简单介绍下天天酷跑电脑版官网,天天酷跑积分版12,希望对各位
-
环球简讯:人民财评:燃旺人间“烟火气”
国家统计局近日公布了今年一季度经济数据。一季度,我国餐饮收入达12136亿元,同比增长13 9%,显示了“烟火气”加快回归。餐饮业营业收入占我
-
2023年04月21日赵老哥现身新华联 德恩精工
1、新华联上榜原因:连续三个交易日内跌幅偏离值累计达20%的证券。截止收盘,新华联报收2 08元 股,涨幅-9 96%,成交量10万手,成交额0 23亿元,换手
-
新资讯:2023上海车展:捷尼赛思G90国内首发并开启预售
2023上海车展,现代高端品牌旗舰车型全新捷尼赛思G90完成国内首发并开启预售,预售价区间71 80-86 80万元。据官方介绍,到2025年捷尼赛思所有
-
世界快资讯丨东湖高新2022年营收净利双增长 工程建设业务营收破百亿元
4月21日,武汉东湖高新集团股份有限公司(以下简称“东湖高新”)发布2022年年度报告。公告显示,东湖高新全年实现营业收入139 86亿元,同比增
-
孔庆丰-环球观焦点
1、《孔庆丰》是2008年10月山西科学技术出版社出版的图书,作者是孔繁亮。2、主要取材于孔繁亮同志积累和收集的处方
-
巴东一中:深山里的“云上学宫” 世界播资讯
巴东一中:深山里的“云上学宫”---湖北省巴东县第一高级中学创办于1943年,2011年迁入新校区。新校区占地总面积304亩,建筑面积10万平方米,
-
冰雪主题特色研学进行时
新湖南客户端4月19日讯(通讯员:郭牧白 万泽川 孙雨蒙)4月19日,由中南传媒集团新华启承岳阳公司全程保驾护航的岳
-
华东医药一季度营收破百亿 研发投入3.87亿
新京报讯(记者王卡拉)4月20日晚间,华东医药披露2023年第一季度业绩报告,报告期内的营业收入为101 15亿元,同比增长13 23%,营业收入首次单季
-
视焦点讯!三个的的用法顺口溜视频_三个的的用法顺口溜
1、,“的”、“地”、“得”这三个字的用法各不相同,恰当地使用有助于学习和理解。2、低年级的学生一时难以分清,这是正常的
-
2023海口五一哪里适合亲子游?
海口五一亲子游景区推荐海口热带农业科技博览园热带生态农业科技馆精准水肥控制、农业技术展示、农业设施栽培和特色水果生态种植遍布场馆各区
-
3月《王者荣耀》蝉联全球手游畅销榜冠军 吸金2.15亿美元
4月21日,据SensorTower,3月《王者荣耀》在全球AppStore和GooglePlay吸金2 15亿美元,蝉联全球手游畅销榜冠军。《PUBGMobile》(合并《和平精