世界动态:重庆酉阳:碧水青山引客来
重庆酉阳:碧水青山引客来
(相关资料图)
在此之前,去看了下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; }}
关键词:
重庆酉阳:碧水青山引客来
汽车玻璃不贴膜可以,但是影响还是有的,比如防紫外线、隔热、安全性都会受到影响。当然贴了膜会更好,下面说说贴膜的好处:贴车膜免遭来自太
华声在线4月19日讯(通讯员廖鑫颖刘阳)近日,南华大学衡阳医学院药学院药学专业本科生谭俊艳等在国际期刊Interna
该基金的基金经理为张清华,张清华于2013年12月23日起任职本基金基金经理,任职期间累计回报223 38%。证券之星力求但不保证该信息(包括但不限
今天来聊聊关于墨绿色背景图片,墨绿色背景的文章,现在就为大家来简单介绍下墨绿色背景图片,墨绿色背景,希望对各位小伙伴们有
为更好地满足老年人多样化、多层级养老服务需求,今年,广陵区持续推进适老化改造提升行动,对350户老年家庭实施“原居享老优化服务”,通过对
4月21日消息,eBay澳大利亚近日宣布将奢侈品钱包纳入其正品保证计划,以提高消费者的购买信心。eBay澳大利亚现在开始为价值超过350美元的奢侈
快科技4月20日消息,据媒体报道,近日,有网友反映上海车展安检扫描后会要求开包检查是否有横幅、海报等物品。从拍摄的视频看
4月13日,福建省首单“智网减排贷”绿色贷款落地,厦门智慧电力成套新能源科技有限公司(以下简称“新能源科技公司”)成功申
1、阿根廷红虾为啥便宜2、阿根廷红虾是阿根廷南部海域的一种野生虾。它是红色的,营养丰富,富含铁、维生素B12、蛋白质等元
网络就医需谨慎!你在网上咨询的医生可能是移花接木
蒙牛李鹏程:中国乳企“出海”应向世界讲好中国故事
4月21日,生意社二氯甲烷基准价为2672 00元 吨,与本月初(2572 50元 吨)相比,上涨了3 87%。二氯甲烷年度统计(2022-04-21--2
詹金斯:琼斯顶替莫兰特出任球队首发这不会改变我们的打法,科学家,美国篮球,湖人主场,贾·莫兰特,孟菲斯灰熊队,泰厄斯·琼斯,罗伊·詹金斯
每经AI快讯,开源证券04月20日发布研报称,给予安宁股份(002978 SZ,最新价:37 55元)评级。评级理由主要
云南咖啡“火出圈”之后怎么干云南咖啡为什么“火出圈”?又为何“点不燃”投资界?带着这些问题,《证券日报》记者实地走访云南咖啡主产区,
1、质权是债权人于债务人不履行到期债务或发生约定的情形时,得就债务人或第三人转移占有或经登记而供担保的动产或权利之变价价
煌上煌:没有进入干果、蜜饯等休闲零食计划,蜜饯,广东,干果,果干,煌上煌,卤制品,休闲零食,腌制食品,中国农业公司
市委书记陈吉宁,市委副书记、市长龚正今天(4月20日)上午会见了即将奔赴新疆、三峡库区等对口支援地区的上海新一批援派干部
人民网北京4月19日电(记者申佳平)“总体上看,一季度我国经济发展实现了良好开局。”4月19日,在国家发展改革委举行的
北京时间4月20日消息,2023赛季中超联赛第二轮比赛展开争夺,武汉三镇坐镇主场迎来了北京国安的挑战,在比赛中,武汉三镇门将刘殿座的一次低级
中央气象台4月21日06时继续发布强对流天气蓝色预警:预计4月21日08时至22日08时,贵州中部、湖南南部、江西南部、广西东北部、广东中北部和东
今天跟大家分享突破买点的重要性,刚好前些天讲过一只股票,今天再度拿出来跟朋友们一起聊聊。看下面的图:yft这只股票前几天说过,今天向下破
日常生活中难免会磕磕碰碰,有时手臂受伤了想知道是否是手臂骨折,让我们一起来看看手臂骨折的症状吧。第一、局部的青紫肿胀;第
广发证券发布研究报告称,予中航科工(02357)“增持”评级,看好其所处航空赛道景气度持续提升,近期直升机A股整体上市和中航电子吸并中航机