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)检查锁状态。
相关推荐
shizhenshide4 天前
物联网(IoT)设备如何应对验证码?探讨无头浏览器与协议级解决方案
java·struts·microsoft·验证码·ezcaptcha
AC赳赳老秦10 天前
DeepSeek-Coder vs Copilot:嵌入式开发场景适配性对比实战
java·前端·后端·struts·mongodb·copilot·deepseek
塔能物联运维12 天前
设备自适应采样率忽视能耗致续航降 后来结合功耗模型动态调优
java·后端·struts
墨痕诉清风17 天前
java漏洞集合工具(Struts2、Fastjson、Weblogic(xml)、Shiro、Log4j、Jboss、SpringCloud)
xml·java·struts·安全·web安全·spring cloud·log4j
一起养小猫17 天前
【探索实战】Kurator云边协同实践:基于KubeEdge的分布式物联网平台构建
分布式·物联网·struts
maycho12324 天前
多台三相逆变器并联的 Matlab/Simulink 仿真探索
struts
聊天QQ:688238861 个月前
53.基于matlab的15种图像纹理特征计算。 纹理特征包括小梯度优势 T1、大梯度优势 T...
struts
全栈视界师1 个月前
[AWS IoT 实战3] 设备事件报警 上传图片到 DynamoDB 和 S3功能
物联网·struts·aws
2501_941148611 个月前
C++实时数据处理实战:多线程与异步IO结合高性能代码解析
java·后端·struts
Apache IoTDB2 个月前
时序数据库 IoTDB 集成 MyBatisPlus,告别复杂编码,简化时序数据 ORM 开发
数据库·struts·servlet·时序数据库·iotdb