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)检查锁状态。
相关推荐
大模型微调Online4 天前
深度复盘:Qwen3-4B-Instruct-2507微调实战——打造“快思考、强执行”的 ReAct IoT Agent
java·后端·struts
JQLvopkk7 天前
SpringBoot + MQTT + EMQX:构建高效物联网数据接入平台
spring boot·物联网·struts
想你依然心痛12 天前
时序数据库选型指南:开启高效数据管理之旅
struts·servlet·时序数据库
终端域名14 天前
如何选择有利于品牌宣传的网站域名
java·后端·struts·数字货币域名·网站域名
朴实赋能14 天前
人工智能大模型+智能体:建筑行业数字化转型的“三级金字塔“实践路径
java·后端·struts
正在走向自律21 天前
时序数据管理:金仓数据库破局之道
java·后端·struts·时序数据库·金仓kes v9
Gobysec22 天前
Goby 漏洞安全通告|Apache Struts XWork 组件 XML外部实体注入漏洞(CVE-2025-68493)
struts·安全·apache
浙江巨川-吉鹏25 天前
【城市地表水位连续监测自动化系统】沃思智能
java·后端·struts·城市地表水位连续监测自动化系统·地表水位监测系统
shizhenshide1 个月前
物联网(IoT)设备如何应对验证码?探讨无头浏览器与协议级解决方案
java·struts·microsoft·验证码·ezcaptcha
AC赳赳老秦1 个月前
DeepSeek-Coder vs Copilot:嵌入式开发场景适配性对比实战
java·前端·后端·struts·mongodb·copilot·deepseek