//基本框架
<!-- https://mvnrepository.com/artifact/net.javacrumbs.shedlock/shedlock-spring -->
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>2.5.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>2.5.0</version>
</dependency>
启动类加注解
@EnableScheduling //启动定时任务
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
//配置类
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
@SpringBootConfiguration
public class ShedConfig {
@Resource
private DataSource dataSource;
//连接数据库配置
@Bean
public LockProvider lockProvider() {
return new JdbcTemplateLockProvider(dataSource);
}
}
数据库脚本,直接创建即可,框架会自动识别。
CREATE TABLE `shedlock` (
`name` varchar(64) CHARACTER SET utf8mb4 NOT NULL,
`lock_until` timestamp(3) NULL DEFAULT NULL,
`locked_at` timestamp(3) NULL DEFAULT NULL,
`locked_by` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
启动项目测试:
@Component
public class ScheduledComponent {
@Scheduled(fixedRate = 10 * 1000L)
@SchedulerLock(name = "test", lockAtLeastFor = 2 * 1000L, lockAtMostFor = 20 * 1000L)
public void test() {
System.out.println("定时任务一" + new Date());
}
@Scheduled(fixedRate = 10 * 1000L)
@SchedulerLock(name = "test", lockAtLeastFor = 2 * 1000L, lockAtMostFor = 20 * 1000L)
public void test2() {
System.out.println("定时任务二" + new Date());
}
}
只有一个定时任务,证明成功。