ShedLock

6 篇文章 0 订阅
1 篇文章 0 订阅

1.ShedLock只做一件事。它确保您的计划任务最多同时执行一次。如果正在一个节点上执行任务,它将获取一个锁,以防止从另一个节点(或线程)执行相同的任务。请注意,如果一个任务已在一个节点上执行,则其他节点上的执行不会等待,只会跳过它。

目前,支持通过Mongo,JDBC数据库,Redis,Hazelcast或ZooKeeper协调的Spring计划任务。更多的调度和协调机制以及未来的预期。

ShedLock不是分布式调度程序

请注意,ShedLock不是,也永远不会是完整的调度程序,它只是一个锁定。如果您需要分布式调度程序,请使用其他项目。ShedLock旨在用于您没有准备好并行执行的计划任务但可以安全地重复执行的情况。例如,如果任务从数据库中获取记录,则处理它们并在最后将它们标记为已处理,而不使用任何事务。在这种情况下,ShedLock可能适合您。

2.属性

@SchedulerLock注解有name ,lockAtMostFor ,lockAtLeastFor 三个属性

name :锁名,名称相同的定时器,每次只会执行一个,name类似分组

lockAtMostFor:该属性指定在执行节点死亡时应保留锁的时间。这只是一个后备,在正常情况下,锁定会在任务完成后立即释放,

lockAtLeastFor属性,指定保留锁的最短时间。主要目的是在任务非常短的且节点之间存在时钟差异的情况下防止多个节点执行。这个属性是锁的持有时间。设置了多少就一定会持有多长时间,再次期间,下一次任务执行时,其他节点包括它本身是不会执行任务的。

3.示例,

1.pom:

<dependency>

<groupId>net.javacrumbs.shedlock</groupId>

<artifactId>shedlock-provider-jdbc-template</artifactId>

<version>1.1.1</version>

</dependency>

<dependency>

<groupId>net.javacrumbs.shedlock</groupId>

<artifactId>shedlock-spring</artifactId>

<version>1.1.1</version>

</dependency>

2.代码

@Service
public class TestScheduled {
    private final Logger log = LoggerFactory.getLogger(TestScheduled.class);
    @Autowired
    private ShceDuledService shceDuledService;
    private static final int FOURTEEN_MIN = 1 * 9 * 1000 ;
    @Scheduled(cron="0/10 * * * * ?")
    @SchedulerLock(name = "scheduledTaskName",lockAtMostFor = FOURTEEN_MIN,lockAtLeastFor = FOURTEEN_MIN)
    public void test(){
        log.info("shedlockl执行test"+System.currentTimeMillis());
        shceDuledService.test();
    }

}

 

3.配置类

@Configuration
@EnableScheduling
public class ShedlockConfig {
    @Bean
    public LockProvider lockProvider(DataSource dataSource) {
        return new JdbcTemplateLockProvider(dataSource);
    }
    
    //指定数据表
    /*@Bean
    public LockProvider lockProvider(DataSource dataSource) {
        return new JdbcTemplateLockProvider(dataSource,"test");
    }*/

    @Bean
    public ScheduledLockConfiguration scheduledLockConfiguration(LockProvider lockProvider) {
        return ScheduledLockConfigurationBuilder.withLockProvider(lockProvider)
            .withPoolSize(10)
            .withDefaultLockAtMostFor(Duration.ofMinutes(10))
            .build();
    }
}

 

4.数据库,jdbc数据库直接新建一个表就好,一般默认为

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

这样基本完成了,我们也可以指定表,指定表可以如下配置

 

ShedLock github地址为:https://github.com/lukas-krecan/ShedLock

个人demo地址:https://github.com/hxf044/ShedLock

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值