标签:family font 完成后 VID var -- 超过 data 默认
SpringBoot之数据库锁-@SchedulerLock
分布式锁ShedLock确保计划的任务最多同时执行一次。如果一个任务正在一个节点上执行,它会获得一个锁,该锁将阻止从另一个节点(或线程)执行同一任务。请注意,如果一个任务已经在一个节点上执行,则在其他节点上的执行不会等待,只会跳过它。就是当第一个微服务执行定时任务的时候,会定时任务进行锁操作,然后其他的定时任务就不会再执行,锁操作有一定的时长,超过这个时长以后,再一次,所有的定时任务进行争抢下一个定时任务的执行权限,如此循环。保证了即使是其中的一个定时任务挂掉了,到一定的时间以后,锁也会释放,其他的定时任务依旧会进行执行权的争夺,执行定时任务。
使用方式(Springboot)
1.gradle方式引入依赖
compile(‘net.javacrumbs.shedlock:shedlock-provider-jdbc-template:2.1.0‘)
compile(‘net.javacrumbs.shedlock:shedlock-spring:2.2.0‘)
Maven方式
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>2.2.0</version>
</dependency>
2.启用SchedulerLock
@Scheduled(cron = "0 0/5 * * * *") //五分钟执行一次 @SchedulerLock(name = "ClusterDataDs", lockAtLeastFor = HsConstants.LOCKEDLEASTTIME, lockAtMostFor = HsConstants.LOCKEDMOSTTIME) public void ClusterDataDs(){ }
//在所需要方法的上面加@SchedulerLock注解
3.在数据库里加上创建提供锁的外部存储表(shedlock)
CREATE TABLE shedlock( name VARCHAR(64) , lock_until TIMESTAMP(3) NULL, locked_at TIMESTAMP(3) NULL, locked_by VARCHAR(255), PRIMARY KEY (name) )
属性 | 说明 |
---|---|
name | 锁名称 ,name必须是主键 |
lock_until | 释放锁时间 |
locked_at | 获取锁时间 |
locked_by | 锁提供者 |
//@SchedulerLock声明的锁名称自动创建对应的键值对,提供锁。@SchedulerLock(name = "ClusterDataDs")name值对应的是库里的name的赋值。
例:假设有一个任务,每10分钟执行一次,通常需要花费几分钟才能运行。此外,您希望每15分钟最多执行一次。在这种情况下,可以像这样配置
@Scheduled(fixedDelay = 1000*60*10) @SchedulerLock(name = "queryRechargeBill", lockAtMostFor = 1000*60*15, lockAtLeastFor = 1000*60*5) public void queryRechargeBill(){ // do something }
标签:family font 完成后 VID var -- 超过 data 默认
原文地址:https://www.cnblogs.com/lingjies/p/13206887.html