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,则可能会再次执行该任务,并且结果将不可预测(更多进程将持有锁)。