本文講述如何使用shedlock給spring schedule上鎖,保證集羣內部調度任務不會重複執行,避免資源浪費。java
<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。git
@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分鐘github
CREATE TABLE shedlock( name VARCHAR(64), lock_until TIMESTAMP(3) NULL, locked_at TIMESTAMP(3) NULL, locked_by VARCHAR(255), PRIMARY KEY (name) )
這個須要手工創建,不過能夠優化一下,自動建表。redis
@Scheduled(fixedDelay = 10*1000 /**ms**/,initialDelay = 10*1000) @SchedulerLock(name = "demoLockTask", lockAtMostFor = 5*1000) public void checkTask(){ LOGGER.error("checkTask executed"); }
ShedLockspring