c语言编程笔录

首页 >   > 笔记大全

笔记大全

SpringBoot怎么集成ShedLock实现分布式定时任务

更新时间:2023-11-09
## 什么是ShedLock ShedLock是一个开源的Java库,可用于在分布式系统中实现分布式锁以实现基于时间的任务的定时执行。 它可以确保在一个时间点只有一个节点可以执行定期任务,这对于那些可能具有复杂或昂贵执行成本的作业非常有用。 ## SpringBoot如何集成ShedLock ### 添加依赖 要使用ShedLock,您需要将以下依赖项添加到您的Spring Boot项目中:

        
            net.javacrumbs.shedlock
            shedlock-spring
            ${shedlock.version}
        
        
            net.javacrumbs.shedlock
            shedlock-provider-jdbc-template
            ${shedlock.version}
        
    

这里我们使用了ShedLock的Spring Boot和jdbc-template的提供者,这个后文会说明。 ### 配置ShedLock 接下来,您需要配置ShedLock。您可以在Spring Boot的application.properties文件中设置所有配置属性。

        spring.datasource.url=jdbc:mysql://localhost:3306/test?
        serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&allowPublicKeyRetrieval=true
        spring.datasource.username=root
        spring.datasource.password=123456
        spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
        spring.shedlock.default-lock-at-most-for=PT30S
        spring.shedlock.provider=jdbc
        spring.shedlock.jdbc.table-name=shedlock
    

这里通过配置数据源信息(这里是MySQL)和表名(默认是shedlock)使用了jdbc提供者。 ### 配置业务项目的定时任务 要使用ShedLock来执行你的定时任务,你需要在任务方法上使用@Scheduled定时任务注解和@SchedulerLock ShedLock锁注解。

        @Service
        @Slf4j
        public class ScheduledTask {

            @Scheduled(cron = "0/10 * * * * ?")
            @SchedulerLock(name = "scheduled-task", lockAtMostFor = PT10S, lockAtLeastFor = PT5S)
            public void scheduledTask() {
                log.info("scheduled-task");
            }

        }
    

这里我们编写了一个定时任务scheduledTask()方法,并使用@Scheduled来设置每10秒钟执行一次,使用@SchedulerLock注解来代表使用ShedLimit锁,在lockAtMostFor和lockAtLeastFor中设置最大和最小锁定时间,这里设置了10秒和5秒。 在每次执行任务之前和之后,ShedLock会自动在数据源上获取和释放锁。 ## 总结 通过使用ShedLock,我们可以轻松实现分布式互斥锁,以确保在任何给定时间只有一个节点可以执行定期作业。使用ShedLock的Spring Boot提供程序可以轻松集成ShedLock到Spring Boot应用程序,而不需要太多配置的工作。