分布式定时任务锁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