定时任务锁ShedLock的使用


一、简介

ShedLock主要用于多个相同服务在分布式环境下执行同一定时任务时,确保只有一个服务执行,即保证同一时刻,同一定时任务只被执行一次。可以通过JDBC数据库、Redis、Mongo、Hazelcast、ZooKeeper等实现锁的功能。

下面以jdbc实现锁功能为例

二、引入依赖

<!-- https://mvnrepository.com/artifact/net.javacrumbs.shedlock/shedlock-spring -->
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-spring</artifactId>
    <version>4.29.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/net.javacrumbs.shedlock/shedlock-provider-jdbc-template -->
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-provider-jdbc-template</artifactId>
    <version>4.23.0</version>
</dependency>

三、创建表

CREATE TABLE shedlock(
    name VARCHAR(64) , 
    lock_until TIMESTAMP(3) NULL, 
    locked_at TIMESTAMP(3) NULL, 
    locked_by  VARCHAR(255), 
    PRIMARY KEY (name)
) 

name:锁的名称

lock_until:释放锁时间

locked_at: 获取锁时间

locked_by:锁持有者,默认为主机名

四、配置锁

@Configuration
@EnableSchedulerLock(defaultLockAtMostFor = "PT5M")
public class ShedLockConfiguration {

    /**
     * 创建数据库LockProvider
     */
    @Bean
    public LockProvider lockProvider(DataSource dataSource) {
        return new JdbcTemplateLockProvider(dataSource);
    }
}

五、参数说明

@SchedulerLock注解主要参数:

name:锁的名称,必须保证唯一;

lockAtMostFor:成功执行任务的节点所能拥有的独占锁的最长时间,设置的值要保证比定时任务正常执行完成的时间大一些;

lockAtLeastFor:成功执行任务的节点所能拥有的独占锁的最短时间,其主要目的是任务执行时间可能很短,防止多个节点执行。

@EnableSchedulerLock注解主要参数:

defaultLockAtMostFor:lockAtMostFor的默认时间;

defaultLockAtLeastFor:lockAtLeastFor的默认时间。

六、测试

@EnableScheduling
public class ShedLockTest {

    @Scheduled(cron = "0/30 * * * * ?")
    @SchedulerLock(name = "schedule", lockAtMostFor = "10", lockAtLeastFor = "5s")
    public void SynchronousSchedule() {
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
         System.out.println("执行了一次定时任务");
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_lrs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值