(资料图)
在此之前,去看了下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分布式锁实
- 诺丁汉大学世界排名_诺丁汉 天天速读
- 世界观热点:日本发现失事直升机主体机身
- 桂林市安全教育平台(桂林市民政局)
- 曝浪潮集团现花式加班标语,济南劳动部门
- 奇瑞e5参数配置_奇瑞e5
- 杏子怎么存放保鲜不坏掉_新鲜杏怎么长时
- 可数名词和不可数名词怎么区分要有例句_
- 焦点速读:浙江德清:“民族团结杯”篮球
- 环球短讯!正视电子竞技产业的价值
- 智慧熊·新课标必读名著:水孩子_对于智
- 致仕与乞骸骨区别 致仕与乞骸骨有什么不同
- 哪些食品可以防癌_什么食品可以防癌 全
- 东北四省区联动开展毕业生专项招聘 岗位
- 全球速递!河南二级建造师继续教育app_河
- 狮山有家隐秘的农庄,传统地道的农家味,
- 【大国基理】“三进四必”探索社区治理新
- 倍轻松“不轻松”:财务总监上任仅4个月
- 美媒晒图赞雷霆赢麻了:赛季预测17胜 未
- 男士生日礼物送啥好
- 专访:中国财政政策为全球应对气变作出重
- 签马关条约时,李鸿章挨了一枪,跟着喊出
- 视点!运河风流
- 最新消息:国际金价收创一年来新高 4只
- 林俊宇钢琴_金宇 青年钢琴家|全球视点
- 少数民族传统节日及其风俗_少数民族的传
- 李楠:我觉得我们年轻球员拼得不错 大家
- 天天热点!送女的礼物送什么好呢
- 环球速递!苹果内测iOS 16.6 解决BUG问题
- 重磅!扬州又一城中村即将全面拆迁!这次
- 别克凯越断电瓶会锁防盗吗(别克凯越电瓶
- 铅精矿板块上市公司2023年有哪些(4月14日)
- 陕西省持续推进政府职能转变和“放管服”
- 环球视讯!知行合一是什么意思知乎(知行
- 京山市生活垃圾焚烧发电项目环境影响报告
- 环球今日报丨uhr150_uh
- 49股主力资金净流出超1亿元,三六零 浪
- 今日热讯:小米13 Ultra跑分曝光:毫无惊喜
- 300多家门店,突然关闭!网友:正被年轻
- 广州海关关区对巴西进出口贸易快速增长,
- 新动态:湖北省武汉市2023-04-14 07:02
- 视听类App能否“只收一次费”?|今日热搜
- 碘单质是固体吗_碘单质
- 如何煮毛豆花生_如何煮毛豆
- 美团-W(03690)根据获行使股份奖励计划授
- 世界快看点丨诺禾致源董事长李瑞强:今年
- 天天热门:全球央行观察丨美国3月CPI继续
- 新华保险:一季度累计原保险保费收入为64
- 今日聚焦!2023年4月13日安徽省小麦价格最
- 镇平遮山镇:清单式量化考核 建强基层战
- 环球热议:胜蓝股份董秘回复:公司有应用
- 陕西安康高新区:年底前购新房契税补贴50
- 国信传媒行业2023年4月投资策略:大模型
- 世界视点!延长县黑家堡镇:大棚春意浓
- 我潜入了“约死群”,聊天内容震碎三观
- 【环球播资讯】70秒带你看南海海域扫雷编
- 日本10年期新发国债收益率达0.5%上限
- 【天天播资讯】高频数据看消费回暖(经济
- 东吴证券:加息尾声渐进 金价趋势上行
- 【焦点热闻】北辰实业:4月12日融券卖出8
- 专访:中国财政政策为全球应对气变作出重
- 签马关条约时,李鸿章挨了一枪,跟着喊出
- 视点!运河风流
- 最新消息:国际金价收创一年来新高 4只
- 林俊宇钢琴_金宇 青年钢琴家|全球视点
- 少数民族传统节日及其风俗_少数民族的传
- 李楠:我觉得我们年轻球员拼得不错 大家
- 天天热点!送女的礼物送什么好呢
- 环球速递!苹果内测iOS 16.6 解决BUG问题
- 重磅!扬州又一城中村即将全面拆迁!这次
- 别克凯越断电瓶会锁防盗吗(别克凯越电瓶
- 铅精矿板块上市公司2023年有哪些(4月14日)
- 陕西省持续推进政府职能转变和“放管服”
- 环球视讯!知行合一是什么意思知乎(知行
- 京山市生活垃圾焚烧发电项目环境影响报告
- 环球今日报丨uhr150_uh
- 49股主力资金净流出超1亿元,三六零 浪
- 今日热讯:小米13 Ultra跑分曝光:毫无惊喜
- 300多家门店,突然关闭!网友:正被年轻
- 广州海关关区对巴西进出口贸易快速增长,
- 新动态:湖北省武汉市2023-04-14 07:02
- 视听类App能否“只收一次费”?|今日热搜
- 碘单质是固体吗_碘单质
- 如何煮毛豆花生_如何煮毛豆
- 美团-W(03690)根据获行使股份奖励计划授
- 世界快看点丨诺禾致源董事长李瑞强:今年
- 天天热门:全球央行观察丨美国3月CPI继续
- 新华保险:一季度累计原保险保费收入为64
- 今日聚焦!2023年4月13日安徽省小麦价格最
- 镇平遮山镇:清单式量化考核 建强基层战
- 环球热议:胜蓝股份董秘回复:公司有应用
- 陕西安康高新区:年底前购新房契税补贴50
- 国信传媒行业2023年4月投资策略:大模型
- 世界视点!延长县黑家堡镇:大棚春意浓
- 我潜入了“约死群”,聊天内容震碎三观
- 【环球播资讯】70秒带你看南海海域扫雷编
- 日本10年期新发国债收益率达0.5%上限
- 【天天播资讯】高频数据看消费回暖(经济
- 东吴证券:加息尾声渐进 金价趋势上行
- 【焦点热闻】北辰实业:4月12日融券卖出8
- 沙尘暴蓝色预警:京津冀等地有扬沙浮尘,
- 全新世大暖期名词解释_全新世 环球新消息
- 单位有哪些类型_单位有哪些-百事通
- 天天热推荐:日本议员带病怒斥“台湾有事
- 世界播报:还珠之和敬公主重生 和敬公主
- 全球速讯:舒泰神:公司不涉及盘古、AIGC
- 潘林_关于潘林介绍_环球热讯
- 世界热消息:天合光能跌3.77% 招商证券
- 环球信息:微信上线新功能,可以赚钱!
- 【全球报资讯】杜仲粉的功效与作用吃法_
- 全球视点!美国资本集团增持创科实业约51
- 天润工业技术股份有限公司、文登恒润锻造
- 精彩看点:00后网红骑摩托车遇车祸身亡
- 合并挂钩官网在哪下载 最新官方下载安装
- 环球热议:南京大屠杀幸存者郑锦阳去世
- 全球热讯:华阴千亩小麦油菜观光区春天里
- 取消!暂停!今早杭州多所学校发出紧急通
- 河北继续发布大风蓝色预警:局地阵风7级
- 13003d三极管参数(13003三极管参数)_全
- 一猫汽车app(一猫汽车电商平台) 环球短讯