Spring Scheduling Tasks+Redis实现分布式定时任务

Spring Scheduling Tasks+Redis实现分布式定时任务

介绍

ShedLock是一个在分布式环境中使用的定时任务框架,用于解决在分布式环境中的多个实例的相同定时任务在同一时间点重复执行的问题。ShedLock确保计划的任务最多同时执行一次。如果一个任务正在一个节点上执行,它会获得一个锁,该锁将阻止从另一个节点(或线程)执行同一任务。请注意,如果一个任务已经在一个节点上执行,则在其他节点上的执行不会等待,只是将其跳过。简单来说,ShedLock本身只做一件事情:保证一个任务最多同时执行一次。所以如官网所说的,ShedLock不是一个分布式调度器,只是一个锁!

实现

引入依赖

复制代码
<!-- Spring Scheduling Tasks -->
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-spring</artifactId>
    <version>4.23.0</version>
</dependency>

<!-- Spring Scheduling Tasks Redis -->
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-provider-redis-spring</artifactId>
    <version>4.23.0</version>
</dependency>

配置

java 复制代码
@Configuration
public class ScheduledLockConfig {

    @Bean
    public LockProvider lockProvider(RedisConnectionFactory connectionFactory) {
        return new RedisLockProvider(connectionFactory);
    }
}

配置启动类

java 复制代码
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "3m")
@SpringBootApplication()
public class SystemApplication {

    public static void main(String[] args) {
        SpringApplication.run(SystemApplication.class, args);
    }

}

@EnableScheduling:开启Spring自带定时任务

@EnableSchedulerLock:开启分布式定时任务服务,defaultLockAtMostFor默认最多锁定多久,这里设置的3分钟

创建定时任务

java 复制代码
@Slf4j
@Component
public class LogJob {

    /**
     * 每月1号凌晨4点执行
     */
    @Scheduled(cron = "0 0 4 1 * ?")
    //name:锁的唯一标识符
    //lockAtMostFor:指定如果任务执行完成但未能正确释放锁时,锁最多保持的时间,防止死锁,这里设置的2分钟
    //lockAtLeastFor:锁至少持有多久,对于那些执行速度可能非常快的任务特别有用,它保证了即使任务快速完成,锁也会保持一定的时间,从而防止过于频繁地尝试获取锁的情况。这里设置1分钟
    @SchedulerLock(name = "xxx", lockAtMostFor = "2m", lockAtLeastFor = "1m")
    public void clearGatewayLog() {
        try {
            log.info("开始执行-分布式定时任务");
            ...业务逻辑
            log.info("执行完成-分布式定时任务");
        } catch (Exception e) {
            log.error("执行失败-分布式定时任务", e);
        }
    }
}

参考

https://blog.csdn.net/a767815662/article/details/104459814

https://sca.aliyun.com/docs/2023/user-guide/schedulerx/quick-start/?# Spring Scheduling Tasks+Redis实现分布式定时任务

介绍

ShedLock是一个在分布式环境中使用的定时任务框架,用于解决在分布式环境中的多个实例的相同定时任务在同一时间点重复执行的问题。ShedLock确保计划的任务最多同时执行一次。如果一个任务正在一个节点上执行,它会获得一个锁,该锁将阻止从另一个节点(或线程)执行同一任务。请注意,如果一个任务已经在一个节点上执行,则在其他节点上的执行不会等待,只是将其跳过。简单来说,ShedLock本身只做一件事情:保证一个任务最多同时执行一次。所以如官网所说的,ShedLock不是一个分布式调度器,只是一个锁!

实现

引入依赖

复制代码
<!-- Spring Scheduling Tasks -->
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-spring</artifactId>
    <version>4.23.0</version>
</dependency>

<!-- Spring Scheduling Tasks Redis -->
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-provider-redis-spring</artifactId>
    <version>4.23.0</version>
</dependency>

配置

java 复制代码
@Configuration
public class ScheduledLockConfig {

    @Bean
    public LockProvider lockProvider(RedisConnectionFactory connectionFactory) {
        return new RedisLockProvider(connectionFactory);
    }
}

配置启动类

java 复制代码
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "3m")
@SpringBootApplication()
public class SystemApplication {

    public static void main(String[] args) {
        SpringApplication.run(SystemApplication.class, args);
    }

}

@EnableScheduling:开启Spring自带定时任务

@EnableSchedulerLock:开启分布式定时任务服务,defaultLockAtMostFor默认最多锁定多久,这里设置的3分钟

创建定时任务

java 复制代码
@Slf4j
@Component
public class LogJob {

    /**
     * 每月1号凌晨4点执行
     */
    @Scheduled(cron = "0 0 4 1 * ?")
    //name:锁的唯一标识符
    //lockAtMostFor:指定如果任务执行完成但未能正确释放锁时,锁最多保持的时间,防止死锁,这里设置的2分钟
    //lockAtLeastFor:锁至少持有多久,对于那些执行速度可能非常快的任务特别有用,它保证了即使任务快速完成,锁也会保持一定的时间,从而防止过于频繁地尝试获取锁的情况。这里设置1分钟
    @SchedulerLock(name = "xxx", lockAtMostFor = "2m", lockAtLeastFor = "1m")
    public void clearGatewayLog() {
        try {
            log.info("开始执行-分布式定时任务");
            ...业务逻辑
            log.info("执行完成-分布式定时任务");
        } catch (Exception e) {
            log.error("执行失败-分布式定时任务", e);
        }
    }
}

参考

https://blog.csdn.net/a767815662/article/details/104459814

https://sca.aliyun.com/docs/2023/user-guide/schedulerx/quick-start/?

相关推荐
程序员黑豆3 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年4 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅4 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
2603_965148114 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
小席是个热心肠4 小时前
AI相关的自我学习
java·人工智能·学习
知无不研7 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
数智化管理手记7 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
cfm_29147 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统8 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
C++ 老炮儿的技术栈8 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐