Spring Boot 整合 ShedLock 处理定时任务重复

ShedLock 简介

ShedLock 是一个轻量级分布式锁库,用于确保定时任务在分布式环境中仅执行一次。通过锁机制,防止多个实例同时运行同一任务。


添加依赖

pom.xml 中引入 ShedLock 的 Spring Boot Starter 和数据库驱动(以 JDBC 为例):

XML 复制代码
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-spring</artifactId>
    <version>4.44.0</version>
</dependency>
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-provider-jdbc-template</artifactId>
    <version>4.44.0</version>
</dependency>

配置数据库表

创建用于存储锁信息的表(以 MySQL 为例):

sql 复制代码
CREATE TABLE shedlock (
    name VARCHAR(64) PRIMARY KEY,
    lock_until TIMESTAMP(3) NULL,
    locked_at TIMESTAMP(3) NULL,
    locked_by VARCHAR(255)
);

配置 ShedLock

在 Spring Boot 配置类中启用 ShedLock 并指定锁提供者:

java 复制代码
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class SchedulerConfig {
    @Bean
    public LockProvider lockProvider(DataSource dataSource) {
        return new JdbcTemplateLockProvider(dataSource);
    }
}
  • defaultLockAtMostFor:定义锁的默认最大持有时间(如 30 秒)。

使用注解标记定时任务

在定时任务方法上添加 @SchedulerLock 注解:

java 复制代码
@Component
public class ScheduledTasks {
    @Scheduled(cron = "0 */5 * * * *") // 每5分钟执行
    @SchedulerLock(name = "reportTask", lockAtLeastFor = "PT5M", lockAtMostFor = "PT10M")
    public void generateReport() {
        // 任务逻辑
    }
}
  • name:锁的唯一标识,需全局唯一。
  • lockAtLeastFor:最短锁持有时间(避免短周期任务重复)。
  • lockAtMostFor:最大锁持有时间(超时后自动释放)。

支持的锁提供者

除 JDBC 外,ShedLock 还支持以下存储:

  • MongoDBshedlock-provider-mongo
  • Redisshedlock-provider-redis-spring
  • Zookeepershedlock-provider-zookeeper-curator

注意事项

  1. 确保数据库时区与应用一致,避免锁时间计算错误。
  2. lockAtMostFor 应大于任务执行时间,否则可能导致多实例并发执行。
  3. 生产环境建议结合监控(如 Prometheus)检查锁状态。
相关推荐
wdfk_prog20 小时前
结合QBoot与HPatchLite实现高效差分升级(FOTA)
java·后端·struts
编码追梦人5 天前
基于 STM32 的智能语音唤醒与关键词识别系统设计 —— 从硬件集成到算法实现
stm32·算法·struts
百锦再8 天前
破茧成蝶:全方位解析Java学习难点与征服之路
java·python·学习·struts·kafka·maven·intellij-idea
塔能物联运维10 天前
物联网设备运维中的自动化合规性检查与策略执行机制
java·运维·物联网·struts·自动化
Moniane16 天前
时序数据库全面重构指南
java·后端·struts
weixin_4569042722 天前
工业自动化通信控制
运维·struts·自动化
道199323 天前
50 台小型无人车与50套穿戴终端 5 公里范围内通信组网方案深度研究
java·后端·struts
亿坊电商2 个月前
物联网领域中PHP框架的最佳选择有哪些?
物联网·struts·php
lingggggaaaa2 个月前
小迪安全v2023学习笔记(八十一讲)—— 框架安全&ThinkPHP&Laravel&Struts2&SpringBoot&CVE复现
笔记·学习·struts·安全·网络安全·laravel