参考:https://blog.youkuaiyun.com/johnf_nash/article/details/90741405
gitlab:https://github.com/lukas-krecan/ShedLock
ShedLock支持多个锁供应媒介,jdbc、redis、mongdob、etcd、zookeeper等等都支持。这里我使用jdbc,所以首先要创建表用于存储锁
创建表
# MySQL, MariaDB
CREATE TABLE shedlock(name VARCHAR(64) NOT NULL, lock_until TIMESTAMP(3) NOT NULL,
locked_at TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (name));
# Postgres
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));
# Oracle
CREATE TABLE shedlock(name VARCHAR(64) NOT NULL, lock_until TIMESTAMP(3) NOT NULL,
locked_at TIMESTAMP(3) NOT NULL, locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (name));
# MS SQL
CREATE TABLE shedlock(name VARCHAR(64) NOT NULL, lock_until datetime2 NOT NULL,
locked_at datetime2 NOT NULL, locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (name));
# DB2
CREATE TABLE shedlock(name VARCHAR(64) NOT NULL PRIMARY KEY, lock_until TIMESTAMP NOT NULL,
locked_at TIMESTAMP NOT NULL, locked_by VARCHAR(255) NOT NULL);
依赖
<properties>
<shedlock.version>4.28.0</shedlock.version>
</properties>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>${shedlock.version}</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>${shedlock.version}</version>
</dependency>
配置
@Configuration
@EnableScheduling // 启用spring scheduling
@EnableSchedulerLock(defaultLockAtMostFor = "10m") // 启用 SchedulerLock
public class ShedLockConfig {
@Bean
public LockProvider lockProvider(DataSource dataSource) {
// return new JdbcTemplateLockProvider(datasource, "my_schema.shedlock");
return new JdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(new JdbcTemplate(dataSource))
.usingDbTime() // Works on Postgres, MySQL, MariaDb, MS SQL, Oracle, DB2, HSQL and H2
.build()
);
}
}
测试定时任务
@Component
@Slf4j
public class TestTask {
/**
* 每30秒执行
*/
@Scheduled(cron = "0/30 * * * * ?")
@SchedulerLock(name = "TEST_JOB", lockAtMostFor = "1m")
public void doTask() {
log.info(Thread.currentThread().getName()+"===task run");
// do something
// ....
// ....
log.info(Thread.currentThread().getName()+"===task end");
}
}
这时数据库会有一条记录
SELECT * FROM shedlock