## @SchedulerLock注解 @SchedulerLock注解支持的五个参数配置: name 用来标注一个定时服务的名字,被用于写入数据库作为区分不同服务的标识,如果有多个同名定时任务则同一时间点只有一个执行成功 lockAtMostFor 成功执行任务的节点所能拥有独占锁的最长时间,单位是毫秒ms lockAtMostForString 成功执行任务的节点所能拥有的独占锁的最长时间的字符串表达,例如“PT5M”表示为5分钟 lockAtLeastFor 成功执行任务的节点所能拥有独占锁的最短时间,单位是毫秒ms lockAtLeastForString 成功执行任务的节点所能拥有的独占锁的最短时间的字符串表达,例如“PT5M”表示为5分钟 ## 实际使用案例 (1) pom依赖文件: ```xml net.javacrumbs.shedlock shedlock-spring 2.5.0 net.javacrumbs.shedlock shedlock-provider-jdbc-template 2.5.0 ``` (2) 接下来开始写配置类: 实现配置类,以提供LockProvider ```java @EnableSchedulerLock(defaultLockAtMostFor = "PT5M") @Configuration @EnableScheduling public class ShedlockConfig { @Bean public LockProvider lockProvider(DataSource dataSource) { return new JdbcTemplateLockProvider(dataSource); } @Bean public ScheduledLockConfiguration scheduledLockConfiguration(LockProvider lockProvider) { return ScheduledLockConfigurationBuilder .withLockProvider(lockProvider) .withPoolSize(10) .withDefaultLockAtMostFor(Duration.ofMinutes(10)) .build(); } } ``` (3) 在数据库里加上创建提供锁的外部存储表(shedlock): ```sql CREATE TABLE shedlock( name VARCHAR(64), lock_until TIMESTAMP(3) NULL, locked_at TIMESTAMP(3) NULL, locked_by VARCHAR(255), PRIMARY KEY (name) ) ``` (4) 实际使用: ```java @Component public class FileScheduledTask { //每30秒执行一次 @Scheduled(cron = "0/30 * * * * ? ") @SchedulerLock(name = "test", lockAtMostForString = "PT40S", lockAtLeastForString = "PT40S") public void test() { System.out.println("定时任务"); } } ```