针对RedisTemplate分布式锁实现WatchDog
(资料图)
在此之前,去看了下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
- 东方电气董秘回复:2022年第4季度利润偏低的主要原因是当期确认的费用增加较多 环球今头条
- 【全球时快讯】外汇局:境外投资者对人民币资产投资热情明显回升,当前A股估值相对偏低
- 湘西联通承建项目入选湖南省“数字新基建”100个标志性项目|每日简讯
- 秦刚:维护二战后国际秩序是神圣职责 世界微动态
- 农业农村经济运行势头良好
- 43.5%、62.9%、50.8%!我国造船三大指标市场份额均位居世界第一-环球消息
- 创新“E巡防”联防机制 “E”起护航青少年成长
- 天天热讯:清华大学博士生、诗人伯竑桥:我的阅读分“攀登类”和“春游式”
- 黑粉侵权赵露思被限制消费 黑粉侵权赵露思未赔偿被限消 天天观速讯
- 环球要闻:石景山的郁金香开了!正在这里盛放——
- 齐齐哈尔:龙沙夜市夏季市场全面开市 环球快讯
- 工商银行龙凤呈祥金条100克价格今天多少一克(2023年04月21日)-世界观点
- 向增长乏力Say No !消费企业该如何构筑第二增长曲线
- 富宝贷逾期11天多久会上征信系统
- 碳中和板块跌0.35% 曙光数创涨10.04%居首
- 每日热讯!收评:指数震荡调整沪指跌0.68% 景点及旅游板块领涨
- 天天滚动:4月20日国内硫酸市场价格暂稳
- 沪硅产业:4月20日融资买入1.8亿元,融资融券余额9.3亿元
- 石鼓区五一街道畔湖路社区:“两癌”筛查暖民心
- 季后赛-浙江2-0广州进半决赛战深圳 刘泽一26+13 世界快资讯
- 张旗:上海城市更新背景下城市街区的文旅迭代
- 半元音字母y和w_半元音 全球快讯
- 因冰激凌事件独占多热搜!宝马MINI道歉,去年在华销量不到3万辆-天天热议
- 出游哄娃秘诀,禾泱泱宝宝零辅食安排! 视点
- 全球讯息:乐活科技(妥了网)与京东科技战略合作 以供金平台Lite版助力后勤物资产业链发展
- 天天视讯!高速公路沥青路面早期损坏分析与防治对策_关于高速公路沥青路面早期损坏分析与防治对策简述
- 天天消息!2023上海车展:哈弗酷狗PHEV正式亮相
- 湖南水运一季度完成固定资产投资10.4亿元 近3年同期最佳 世界观焦点
- 环球今日报丨长峰医院曾3年里留下23条处罚记录具体是什么情况
- 捷豹路虎拟未来5年投入150亿英镑发展电动汽车|每日速讯
- 牛气冲天电影主题曲_牛气冲天主题曲
- 全能营销破解版最新_全能营销破解版
- 当前要闻:中国物品编码中心续展怎么操作(中国物品编码中心续展)
- 热衷“圈子文化”,搞权色、钱色交易 湖北长江出版传媒集团原党委书记陈义国被“双开”|天天滚动
- 手握10万短期闲钱,该存余额宝吗?有没有更划算的打理方式? 世界快看点
- 十年后,电动车价格再跌一半?_环球速讯
- 以一流营商环境赋能民营经济发展(现场评论·海南自贸港观察③)
- 发挥产学研一体化优势,宝山这家企业在细分领域不断进击 世界热议
- 【世界热闻】厦门专项职业能力证书有哪些?
- 2023中国大唐集团内蒙古分公司招聘公告
- 全球今日讯!联想刘军:3S转型将是足以承载大联想未来十年梦想的机会
- 环球观焦点:读懂中国 | 乔根·兰德斯:中国正加速实现双碳目标
- 打造一体化反诈防范体系 奉贤公安启动“全民反诈宣传月”活动
- 全球观热点:生鱼汤的功效和作用_生鱼汤的功效与作用
- 拳皇97七枷社出招表|环球热消息
- 环球关注:软件业务收入突破10万亿 工业软件表现亮眼
- 环球热资讯!智能科技产业引领作用凸显
- 特朗普集团前CFO出狱:曾犯15项税务欺诈罪 认罪后遭东家斥责
- 三亚7家海鲜餐饮店、5家婚纱摄影企业被下架处理_环球今头条
- 焦点!应对暴雨天气 石狮环卫工人雨中坚守
- 海虾的品种大全图解_中国常见海虾大盘点
- 可口可乐试水ChatGPT,开启下一代营销之门?
- 每日速读!不要再熬夜了!从疲劳到癌症只有4步
- 3月份汽车经销商综合库存系数为1.78 库存水平位于警戒线以上
- Python面向对象编程-元类
- 加强标准化工地建设 保障农民工合法权益
- 锦江乐园夜市还在吗_锦江乐园夜市
- 天天讯息:Sophia Webster:梦幻般的女鞋设计与品牌加盟优势
- 环球热消息:BWZJ-FTA DC24V防爆一体化火焰检测器维护与故障排除
- 狄龙:我正在为自己打出名声 我会在G3等着詹姆斯和我说话-环球即时看
- 天天热门:原腾讯QQ空间负责人,T13专家,黄希彤被爆近期被裁员,裁员原因令人唏嘘。。
- 城管执法违章停车罚款多少钱_天天快资讯
- 头条焦点:中国最美小镇的“最美”道路长啥样,你走过吗?
- 天天热点!福能东方收到中山市翠亨新区关于地块有偿收储函件
- 当前热议!农业农村部:生猪养殖有望在二季度末实现扭亏为盈
- 全球时讯:警惕!又到杨柳絮纷飞季 路人小心别“惹火”
- 丽岛新材:安徽五河子公司正在有序建设中
- 每日快讯!内黄县消防救援大队借“职工运动会”开幕式开展消防安全宣传活动
- 【天天快播报】什么是加权平均法 公式是什么
- 巅峰神器传奇好玩吗 巅峰神器传奇玩法简介
- 联合国中文日②|中文多美矣!六国留学生成都武侯祠梦回三国 天天通讯
- 抖音怎么发共创视频?如何提升播放量?|全球快看点
- 农业农村部:力争新增大豆油料面积1000万亩以上
- 世界关注:江西降水过程接力来袭 谨防地质灾害
- 如何退订移动短号集群网业务_什么是短号集群网业务-天天速讯
- 手臂疼痛是风湿病吗,贵阳看风湿好的医院是哪个
- 【环球财经】德国3月申请破产的公司数量环比增加13.2%
- LG C2 4K OLED 电视降至无与伦比的价格
- 【环球聚看点】一季度银行信贷超额完成“开门红”计划 信贷投放将围绕“稳增长”主线保持增长
- 道奇达科他Sport HEMI Hauler是一辆穿羊皮的肌肉卡车
- 让特种兵式旅游在遵循秩序中多元发展|微头条
- 每日时讯!2023 上海车展:贼好看的飞凡 RC ESSENCE
- 32项!2023年青浦区文化科技卫生“三下乡”正式启动
- 随心索衣是哪个国家的品牌_什么档次怎么样_世界热头条
- 热头条丨大学生2000元能炒股吗?
- 微资讯!顺德区气象台发布雷雨大风黄色预警【III级/较重】
- 多因素拖累 厚普股份业绩由盈转亏_每日短讯
- iPhone 14频繁重启 遭大规模用户投诉|今日最新
- 【焦点热闻】发改委:将使更多民间资本参与到国家重大项目建设中来
- 中国星辰丨从无到有,中国载人航天如何大胆跨越?
- 动态:火影:大神用铅笔画3D特效,鸣人大战斑帅出天际
- 环球通讯!党建引领+多元协同+志愿服务!浦东塘桥这个新时代文明实践站传递文明新风
- 天天关注:湖北将出现“倒春寒” 局地降温超15℃
X 关闭
资讯
X 关闭