序
 本文讲述如何使用shedlock给spring schedule上锁,保证集群内部调度任务不会重复执行,避免资源浪费。
 maven
         <dependency> 			<groupId>net.javacrumbs.shedlock</groupId> 			<artifactId>shedlock-spring</artifactId> 			<version>0.16.1</version> 		</dependency>  		<dependency> 			<groupId>net.javacrumbs.shedlock</groupId> 			<artifactId>shedlock-provider-jdbc-template</artifactId> 			<version>0.16.1</version> 		</dependency> 
  shedlock提供了mongo、redis、zookeeper、jdbc等的锁实现,这里使用jdbc。
 
 shedlock配置
 @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();     } } 
  这里使用了jdbc的lock provider,同时设定默认最大的lock expire时间为10分钟
 
 shedlock表
 CREATE TABLE shedlock(     name VARCHAR(64),     lock_until TIMESTAMP(3) NULL,     locked_at TIMESTAMP(3) NULL,     locked_by  VARCHAR(255),     PRIMARY KEY (name) ) 
  这个需要手工建立,不过可以优化一下,自动建表。
 
 实例
     @Scheduled(fixedDelay = 10*1000 /**ms**/,initialDelay = 10*1000)     @SchedulerLock(name = "demoLockTask", lockAtMostFor = 5*1000)     public void checkTask(){         LOGGER.error("checkTask executed");     } 
 doc