分布式定時任務鎖SchedulerLock的使用


分布式定時任務鎖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 {
		代碼省略........
	}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM