分布式定時任務鎖SchedulerLock
ShedLock的實現原理是采用公共存儲實現的鎖機制,確保任務在同一時刻最多執行一次。如果一個任務正在一個節點上執行,則它將獲得一個鎖,該鎖將阻止從另一個節點(或線程)執行同一任務。如果一個任務已經在一個節點上執行,則在其他節點上的執行不會等待,只需跳過它即可 。
配置和使用:
依賴配置:
<!-- shedlock -->
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>2.3.0</version>
</dependency>
配置類config
@Component
public class ShedLockConfig {
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource,tableName);//指定表名,會自動在數據庫中建立這個表,記錄任務執行日志。
}
@Bean
public ScheduledLockConfiguration scheduledLockConfiguration(LockProvider lockProvider) {
return ScheduledLockConfigurationBuilder.withLockProvider(lockProvider)
.withPoolSize(10)
.withDefaultLockAtMostFor(Duration.ofMinutes(10))
.build();
}
}
啟動類的配置:
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")//鎖定時間不超過30s
執行任務的方法:
@Component//該類需要注冊成spring組件
private static final int SYSUSERMOST = 58*60*1000;
private static final int SYSUSERLEAST = 58*60*1000;
@Scheduled(cron = "0 0 23 * * ? ")//時間粒度,可以使用在線工具生成[cron生成工具(https://cron.qqe2.com/ "cron生成工具")]
@SchedulerLock(name = "JobName", lockAtMostFor = SYSUSERMOST, lockAtLeastFor = SYSUSERLEAST)
//任務名稱必須唯一 ,lockAtMostFor最長鎖表時間:(防止節點奔潰,不釋放鎖) lockAtLeastFor 最短鎖表 //時間,防止任務重復跑
@Transactional(rollbackFor = Exception.class)
public void syncDataUser() throws IOException {
代碼省略........
}
