SpringBoot配置ShedLock分布式定时任务
什么是ShedLock
ShedLock是一个在分布式环境中使用的定时任务框架,用于解决在分布式环境中的多个实例的相同定时任务在同一时间点重复执行的问题,解决思路是通过对公用的数据库中的某个表进行记录和加锁,使得同一时间点只有第一个执行定时任务并成功在数据库表中写入相应记录的节点能够成功执行而其他节点直接跳过该任务。当然不只是数据库,目前已经实现的支持数据存储类型除了经典的关系型数据库,还包括MongoDB,Zookeeper,Redis,Hazelcast。
如何使用
ShedLock采用非侵入式编程的思想,通过注解的方式来实现相应的功能。
要使用ShedLock,请执行以下操作
- 启用并配置计划锁定
- 注释您的计划任务
- 配置锁提供程序
1.启用并配置计划锁定
首先,引入依赖
< dependency > < groupId > net.javacrumbs.shedlock </ groupId > < artifactId > shedlock-spring </ artifactId > < version > 2.5.0 </ version > </ dependency >
现在我们需要将库集成到Spring中。为了启用计划锁定,请使用@EnableSchedulerLock注释
@Configuration @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = “ PT30S ”) 类 MySpringConfiguration { ... }
注释您的计划任务
import net.javacrumbs.shedlock.core.SchedulerLock ; ... @Scheduled(...)@ SchedulerLock(name = “ scheduledTaskName ”) public void scheduledTask(){ //做某事 }
@SchedulerLock注解一共支持五个参数,分别是
name 用来标注一个定时服务的名字,被用于写入数据库作为区分不同服务的标识,如果有多个同名定时任务则同一时间点只有一个执行成功
lockAtMostFor 成功执行任务的节点所能拥有独占锁的最长时间,单位是毫秒ms
lockAtMostForString 成功执行任务的节点所能拥有的独占锁的最长时间的字符串表达,例如“PT14M”表示为14分钟
lockAtLeastFor 成功执行任务的节点所能拥有独占所的最短时间,单位是毫秒ms
lockAtLeastForString 成功执行任务的节点所能拥有的独占锁的最短时间的字符串表达,例如“PT14M”表示为14分钟
与Spring进行整合,ShedLock支持两种Spring集成模式。
TaskScheduler代理
需要配置两个Bean,一个是lockProvider,一个是scheduler
默认情况下,ShedLock在Spring周围创建AOP代理TaskScheduler。如果未指定任务计划程序,则会为您创建默认任务计划程序。如果您有特殊需求,只需创建一个bean实现TaskScheduler接口,它将自动包装到AOP代理中。
由于ShedLock使用Mongo,JDBC数据库,Redis,Hazelcast,ZooKeeper等外部存储进行协调。所以我选择的是redis。
<dependency> <groupId> net.javacrumbs.shedlock </ groupId > <artifactId > shedlock-provider-redis-spring </ artifactId > <version> 2.5.0 </version> </dependency > <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
@Configuration @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT5M") public class ShedLockConfig { @Bean public LockProvider lockProvider(RedisTemplate redisTemplate){ return new RedisLockProvider(redisTemplate.getConnectionFactory()); } @Bean public TaskScheduler taskScheduler(){ return new MySpecialTaskScheduler(); } }
预定方法代理
如果你有更多特殊需求,可以像这样使用Scheduled Method代理
@EnableSchedulerLock(mode = PROXY_METHOD,defaultLockAtMostFor = “ PT30S ”)
如果PROXY_METHOD选择了mode,则ShedLock会在每个带@SchedulerLock注释的方法周围创建AOP代理。这种方法的主要优点是它不依赖于Spring调度。缺点是即使您直接调用该方法也会应用锁定。还要注意,目前仅支持void返回方法,如果您注释并调用具有非void返回类型的方法,则会引发异常。
到此这篇关于SpringBoot配置ShedLock分布式定时任务的文章就介绍到这了,更多相关SpringBoot ShedLock分布式定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
fastjson转换对象实体@JsonProperty不生效问题及解决
这篇文章主要介绍了fastjson转换对象实体@JsonProperty不生效问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-08-08SpringMVC返回的ResponseEntity出现乱码及解决
这篇文章主要介绍了SpringMVC返回的ResponseEntity出现乱码及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-02-02Spring Boot 如何使用Liquibase 进行数据库迁移(操作方法)
在Spring Boot应用程序中使用Liquibase进行数据库迁移是一种强大的方式来管理数据库模式的变化,本文重点讲解如何在Spring Boot应用程序中使用Liquibase进行数据库迁移,从而更好地管理数据库模式的变化,感兴趣的朋友跟随小编一起看看吧2023-09-09Maven install 报错"程序包不存在"问题的解决方法
这篇文章主要介绍了Maven install 报错"程序包不存在"问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-07-07从0构建Oauth2Server服务之Refreshing-access-tokens
这篇文章主要为大家介绍了从0构建Oauth2Server服务之Refreshing-access-tokens刷新令牌示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-05-05
最新评论