最近在项目开发过程中,涉及到定时任务的编写,定时任务大家都知道,在多服务器部署时,为了防止同一时间同一任务多次执行的问题,通常需要使用分布式定时任务进行处理,这部分对应的框架也很多,例如:xxl-job,power-job,elastic-job,但是由于考虑到当前所负责开发的项目体量,感觉使用上面所提到的分布式定时任务框架太过于繁重,所以,这里就使用了spring提供的scheduler定时任务注解方式开发,虽然此种方式开发简便,但是同一时间同一任务多次执行的问题还是存在的,因此为了解决此问题,这里便引入了shedlock锁组件。
关于shedlock,这里机翻了官网的一段说明,仅供简单介绍,详细可参看官网介绍(官网地址:https://github.com/lukas-krecan/ShedLock),官网说,shedlock只做一件事,就是确保计划任务最多同时执行一次,如果正在一个节点上执行任务,它将获取一个锁,以防止从另一个节点(或线程)执行相同任务。请注意,过去一个任务已在一个节点上执行,则其他节点上的执行不会等待,只会跳过它;目前支持Mongo、JDBC数据库、redis、hazelcast或zookeeper等存储,shedlock不是分布式调度框架,它只是一个锁!!!
Spring Cloud Alibaba版本:2022.0.0.0-RC1Springboot版本:3.0.0jdk版本:17.0.6ShedLock版本:5.3.0mysql版本:8.0.30
由于项目使用的数据库为MySQL数据库,所以这里使用了shedlock-jdbcTemplate方式,关于其他存储方式的使用可以参看官网(官网地址:https://github.com/lukas-krecan/ShedLock)
(资料图)
CREATE TABLE shedlock(name VARCHAR(64) NOT NULL COMMENT "锁名称", lock_until TIMESTAMP(3) NOT NULL COMMENT "释放锁时间", locked_at TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT "获取锁时间", locked_by VARCHAR(255) NOT NULL COMMENT "锁提供者", PRIMARY KEY (name) );
官网说明:
5.3.0 net.javacrumbs.shedlock shedlock-core ${shedlock.version} net.javacrumbs.shedlock shedlock-spring ${shedlock.version} net.javacrumbs.shedlock shedlock-provider-jdbc-template ${shedlock.version} spring-jdbc org.springframework org.springframework spring-jdbc 6.0.6
说明:
这里单独引入spring-jdbc依赖的原因如下:
由于Springboot 3.0.0版本使用的Spring 6.0.2版本在针对数据表中存在数据插入时,会报Duplicate key violation gets translated to DataIntegrityViolationException instead of DuplicateKeyException异常(issue地址:https://github.com/spring-projects/spring-framework/issues/29511),导致shedlock执行时,报类似异常,针对此问题,spring官方也进行了修复(https://github.com/spring-projects/spring-framework/releases/tag/v6.0.3),但是由于项目依赖管理的父pom定义了spring的版本,这里不方便修改父pom的依赖信息,所以就在项目中单独添加了spring-jdbc的依赖,已解决此异常。异常信息如下:
Spring官方修复信息:
@Configurationpublic class SchedulerLockConfig { @Bean public LockProvider lockProvider(DataSource dataSource) { return new JdbcTemplateLockProvider( JdbcTemplateLockProvider.Configuration.builder() .withJdbcTemplate(new JdbcTemplate(dataSource)) .build() ); }}
在Springboot启动类上添加如下注解:
@EnableScheduling@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
说明:
defaultLockAtMostFor为锁默认的最大锁定时间,可以根据需要赋值,其中S为秒,M为分钟,H为小时,D为天,PT为ISO-8601期限格式,这部分可以参看Duration.parse()文档
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;...@Scheduled(cron = "0 */2 * * * ?")@SchedulerLock(name = "scheduledTaskName", lockAtLeastFor = "PT60S", lockAtMostFor = "PT60S")@Transactional(rollbackFor = Exception.class)public void scheduledTask() { // 代码省略......}
shedlock数据表数据:
@SchedulerLock:
使用此注解的方法被锁定,通过指定锁的名称name属性(锁名称唯一),保证同一时间只能执行一个任务
关于lockAtLeastFor、lockAtMostFor属性说明:
当第一个微服务执行定时任务的时候,会将此定时任务进行锁操作,然后其他的定时任务就不会再执行,锁操作有一定的时长,超过这个时长以后,锁释放,然后所有的定时任务进行争抢下一个定时任务的执行权利,如此循环。其中两个配置lockAtMostFor和lockAtLeastFor,保证了在一个定时任务的区间内只有一个定时任务在执行,同时也保证了即便是其中的一个定时任务挂掉了,到一定的时间以后,锁也会释放,其他的定时任务依旧会进行执行权的争夺,执行定时任务。
上一篇:鲁迅是谁_关于鲁迅是谁简述
下一篇:最后一页
0、写在前面最近在项目开发过程中,涉及到定时任务的编写,定时任务大
大河网讯近日,河南省发展和改革委员会、河南省教育厅、河南省人力资源
6月14日,以“文明交通、任‘游’你行”为主题的“筑牢道路交通安全防
小伙伴们,你们好,今天小夏来聊聊一篇关于鲁迅是谁,关于鲁迅是谁简述
美元兑印度卢比周三难以获得任何有意义的牵引力,整个亚洲市场在温和上
来为大家解答以下的问题,手并进的同义词,携手并进这个很多人还不知道
主力已基本到齐!小蜘蛛阿尔瓦雷斯已到酒店,拿了欧冠大耳朵杯后,职业
来源:北青体育肖赧塞尔维亚籍教头久尔杰维奇率领的中国男足亚运队,将
日前,我们从官方渠道获取到了领克09大五座版的预告图,新车预计将在6
丰田又摊上事了。据外媒报道,当地时间5月31日,丰田汽车北美公司正式
CityLab生活节在饮茶文化保留较好的成都、广东地区,采耳、擦鞋、占卜
5年2 72亿美金,历史第一!约基奇比肩詹姆斯,恩比德又遭质疑,库里,美
直播吧6月14日讯前队友明斯在接受采访时表示,在帮助曼城成为三冠王后
OpenAI今日宣布对其大型语言模型API(包括GPT-4和gpt-3 5-turbo)进行重
双方将共建粤港澳大湾区交叉科学创新研究院(广州),促进学校科研人才实
雷达财经文|杨洋编|深海6月12日晚间,ST天顺披露了关于对深圳证券交易
【友财网讯】-美国股市重新进入牛市,美国经济的表现一直超出预期,这
中国万天控股(01854)午前涨超14%,昨日曾收跌逾28%。截至发稿,涨13 41
根据国家发展改革委公布的成品油价格调价信息,现将天津市调整后的成品
北京青年报讯(记者赵婷婷)记者从北京市气象台获悉,今起4天,本市将
新华社洪都拉斯科潘6月12日电(记者陈昊佺吴昊)握手拥抱,李新伟和拉
记者史有东景溪青山毓黛迎宾客,绿水含情展新姿。6月13日上午,2023中
算命算流产是一种重大的决策,可能会产生长期的影响。根据传统文化和宗
哈喽,大侠们好,我是狂徒张三,欢迎大家收看这期《热血江湖归来》系列
最近,北京的一位支持梅西javascript2python0年的球迷意外得到了一张参
盈利率在5%(含)以内的部分由商业保险机构留用,5%以上的部分全部返还
周三竞篮焦点:飞马主场高歌猛进回归达拉斯争反弹
相信目前很多小伙伴对于信用卡都比较感兴趣,那么小搜今天在网上也
近日,关怀医疗正式宣布完成数亿元C轮融资,本轮投资领投方为国寿股权
新一轮科技革命和产业变革蓬勃兴起,以数字技术为代表的通用目的技术快