Spring Cloud分布式定时器之ShedLock的实现
在实际的项目开发工作中,我们经常会遇到需要做一些定时任务的工作,那么在SpringCloud中是如何实现的?今天来介绍下其中的一种解决方案——轻量级分布式定时锁ShedLock
ShedLock
ShedLock是一个在分布式环境中使用的定时任务框架,用于解决在分布式环境中的多个实例的相同定时任务在同一时间点重复执行的问题。
解决思路是通过对公用的数据库中的某个表进行记录和加锁,使得同一时间点只有第一个执行定时任务并成功在数据库表中写入相应记录的节点能够成功执行而其他节点直接跳过该任务。
目前已经实现的支持数据存储类型不仅仅只有关系型数据库,还包括MongoDB,Zookeeper,Redis,Hazelcast。
1.pom文件添加相关依赖
在pom文件中添加shedLock相关依赖
net.javacrumbs.shedlock shedlock-spring 2.2.0 net.javacrumbs.shedlock shedlock-provider-jdbc-template 2.2.0
2.添加相关配置
在启动类添加@EnableScheduling和@EnableSchedulerLock(defaultLockAtMostFor="PT30S")注解,表示要启动ShedLock定时任务
defaultLockAtMostFor要设置值,不设置会报错;设置值一般设置比定时任务大点值,一般在每个定时任务中都会配置defaultLockAtMostFor值,会覆盖启动类中的值
@EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor="PT30S") publicclassOneStopServiceApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(OneStopServiceApplication.class,args); } }
3.添加ShedLock配类
shedLock支持关系型数据库,以mysql为例,配置mysql以及表名;shedLock默认表名为shedlock,可以设置自定义表名。
@Configuration publicclassScheduledLockConfig{ @Bean publicLockProviderlockProvider(DataSourcedataSource){ //自定义表名 returnnewJdbcTemplateLockProvider(dataSource,"ccsy_shedlock"); } }
4.ShedLock定时任务
@Component publicclassHourTask{ /** *最小锁定时间,一般设置成定时任务小一点 */ privatestaticfinalintMIN_LOCK_TIME=1000;//单位毫秒 /** *最大锁定时间,一般设置成比正常执行时间长的值 */ privatestaticfinalintMAX_LOCK_TIME=1000*2;//单位毫秒 @Scheduled(cron="0/1****?") @SchedulerLock(name="测试",lockAtMostFor=MAX_LOCK_TIME,lockAtLeastFor=MIN_LOCK_TIME) publicvoidvisitCountTaskByTwoHour(){ SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); System.out.println("现在时间是"+format.format(newDate())+Thread.currentThread().getName()); } }
@SchedulerLock注解一共支持五个参数,分别是
- name用来标注一个定时服务的名字,被用于写入数据库作为区分不同服务的标识,如果有多个同名定时任务则同一时间点只有一个执行成功
- lockAtMostFor成功执行任务的节点所能拥有独占锁的最长时间,单位是毫秒ms
- lockAtMostForString成功执行任务的节点所能拥有的独占锁的最长时间的字符串表达,例如“PT14M”表示为14分钟
- lockAtLeastFor成功执行任务的节点所能拥有独占所的最短时间,单位是毫秒ms
- lockAtLeastForString成功执行任务的节点所能拥有的独占锁的最短时间的字符串表达,例如“PT14M”表示为14分钟
5.创建mysql数据库中定时任务ccsy_shedlock表
CREATETABLEccsy_shedlock( NAMEVARCHAR(64), lock_untilTIMESTAMP(3)NULL, locked_atTIMESTAMP(3)NULL, locked_byVARCHAR(255), PRIMARYKEY(NAME))
到此这篇关于SpringCloud分布式定时器之ShedLock的实现的文章就介绍到这了,更多相关SpringCloud分布式定时器内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。