当前位置: 首页 > news >正文

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

ShedLock 简介

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


添加依赖

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

<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 为例):

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 并指定锁提供者:

@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class SchedulerConfig {@Beanpublic LockProvider lockProvider(DataSource dataSource) {return new JdbcTemplateLockProvider(dataSource);}
}

  • defaultLockAtMostFor:定义锁的默认最大持有时间(如 30 秒)。

使用注解标记定时任务

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

@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)检查锁状态。
http://www.dtcms.com/a/552893.html

相关文章:

  • 静态网站开发课程相关新闻做设计图的网站
  • MCU(微控制器单元)上的语音识别
  • 【普中Hi3861开发攻略--基于鸿蒙OS】-- 第 31 章 WIFI 实验-华为 IoTDA 设备接入
  • hive的全连接
  • 集团企业网站设计方案专业做化学招聘的网站有哪些
  • win11 wsl安装Ubuntu-22.04并迁移D盘 以及安装docker
  • 频闪拍照中的相机和光源同步问题
  • 乐吾乐3D可视化案例【智慧汽车三维可视化】
  • 网站图片验证码出不来潜江资讯网电脑版
  • 大模型在百度电商机审应用的落地实践
  • esp8266+dht11传感器实时上报温湿度
  • WPF中为Button设置IsMouseOver和IsPressed事件中改变背景颜色不起作用
  • vagrant nat网络问题-虚拟机同时存在两个IP,并且不能访问外网
  • 微信小程序代理商加盟多少钱郑州网站优化公司价位
  • Ingress-Nginx故障排除
  • WPF ListView 列表
  • 国内资深易经风水专家谷晟阳
  • seo网站优化优化排名关于网站建设电话销售的开场白
  • Docker Swarm K8s云原生分布式部署2025年版
  • 量化投资从入门到入土:什么是股市
  • Windows 下 ComfyUI + Comfy CLI + PyTorch(CUDA)完整源码安装教程
  • wordpress站点管理wordpress去除仪表盘
  • 【SpringMVC】详解用户登录前后端交互流程:AJAX 异步通信与 Session 机制实战
  • Arbess零基础学习,使用Arbess+GitLab实现Vue.js项目构建并主机部署
  • Git 标准工作流程和 Git 使用(持续更新)
  • 阿里云 OceanBase 可观测最佳实践
  • vitest单元测试测试vue中了element项目安装与运行笔记
  • NineData社区版 V4.6.0 正式发布!SQL 窗口新增4个数据源,新增支持OceanBase等多条数据复制和对比链路
  • 仿RabbitMQ实现消息队列(一)--项目介绍
  • 建设网站的法律声明正规赚佣金的平台