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)检查锁状态。
相关推荐
echola_mendes3 天前
InfluxDB(四)——动态 Field/Tag 实现多类型设备统一接入的完整实践指南
java·后端·struts
鉴生Eric10 天前
拉孚BMA系统物联网架构:全面赋能传统楼宇BA系统的数字化转型
java·后端·struts
TaoSense16 天前
全球消费类家庭安防监控行业深度研究报告:AI 驱动下的产业变革与投资机遇
java·人工智能·struts
七夜zippoe17 天前
DolphinDB脚本语言:从入门到精通
后端·struts·脚本·语言·dolphindb
好家伙VCC19 天前
**TEE在嵌入式安全中的应用实践:基于ARM TrustZone的加密存储方案设计与实现*
java·arm开发·python·struts·安全
纸鸢|20 天前
从“一锤子买卖“到“持续价值共生“:物联网软件产品如何做到“叫好又叫座“
java·物联网·struts
七夜zippoe23 天前
DolphinDB入门:时序数据库的正确打开方式
数据库·struts·时序数据库·工业互联网·dolphindb
AAAAA92401 个月前
物联网BOM成本管理:精准化、智能化与可持续化
java·物联网·struts
EmbeddedCore1 个月前
基于 MQTT+JSON 的物联网网关物模型通讯协议(极致精简・缩写版)
java·后端·struts
DolphinDB智臾科技1 个月前
2026 物联网时序数据库选型指南:DolphinDB/InfluxDB/TimescaleDB 深度对比与实践
物联网·struts·时序数据库