利用shedlock+jdbctemplate实现集群时定时任务只执行一次

github教程链接:https://github.com/lukas-krecan/ShedLock
1、在数据执行脚本,SQL脚本链接
https://github.com/lukas-krecan/ShedLock#jdbctemplate

以下为PG数据库

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

2、引入maven依赖

<!--控制定时任务在集群部署的只执行一次 -->
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-spring</artifactId>
            <version>4.9.2</version>
        </dependency>
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-provider-jdbc-template</artifactId>
            <version>4.25.0</version>
        </dependency>
        <!--控制定时任务在集群部署的只执行一次 -->       

3、配置JDBC模板

@Configuration
public class TaskScheduledLockConfig {
    @Bean
    public LockProvider lockProvider(@Qualifier("dataSource") DataSource dataSource) {
        // Works on Postgres, MySQL, MariaDb, MS SQL, Oracle, DB2, HSQL and H2
        return new JdbcTemplateLockProvider(
                JdbcTemplateLockProvider.Configuration.builder()
                        .withJdbcTemplate(new JdbcTemplate(dataSource))
                        .usingDbTime()
                        .build()
        );
    }
}

4、在启动类上配置

@EnableSchedulerLock(defaultLockAtMostFor = "10m")

5、然后在定时任务上配置

@Scheduled(cron = "0 0 1 * * ?")
@SchedulerLock(name = "earlyWarnPushTask",lockAtMostFor = "60m", lockAtLeastFor = "60m")

注意:一定要保证定时任务的名称是唯一的不存在重复,
lockAtMostFor,lockAtLeastFor参数说明
通过设置lockAtMostFor,我们可以确保即使节点死亡,锁也会被释放;通过设置lockAtMostFor,我们可以确保在15分钟内不会执行多次。请注意,lockamostfor只是一个安全网,以防执行任务的节点死亡,因此将其设置为明显大于最大估计执行时间的时间。如果任务花费的时间超过lockamostfor,则可能会再次执行该任务,并且结果将不可预测(更多进程将持有锁)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值