使用 ShedLock 实现多实例定时任务单执行的常见错误及解决办法

news/2025/9/29 14:35:39/文章来源:https://www.cnblogs.com/zhixiaolo/p/19118719

一、ShedLock 基础认知

ShedLock 是一个专注于分布式任务调度协调的 Java 开源项目,核心目标是确保在分布式系统环境下,同一定时任务在同一时间最多只被一个实例执行。其实现机制基于分布式锁原理,通过在任务执行前获取共享锁资源来阻止其他节点的重复执行。该工具支持多种外部存储作为锁协调介质,包括 Jdbc 数据库、Redis、MongoDB、ZooKeeper 等,能够灵活适配不同技术栈的 Java 应用系统。

二、核心工作机制

ShedLock 的运行依赖三个关键机制的协同工作:分布式锁通过外部存储的原子操作实现节点间互斥;锁生命周期由lockAtLeastFor和lockAtMostFor参数控制,分别定义锁的最小持有时间和最大持有时间;Spring AOP 机制则拦截@Scheduled注解方法,在任务执行前后自动处理锁的获取与释放流程。这种设计既保证了分布式环境下的任务唯一性,又通过自动过期机制避免了死锁风险。

三、常见错误与解决方案

外部存储配置不当

分布式锁的正常工作完全依赖外部存储的正确配置。常见问题包括连接参数错误、存储介质选择不当或初始化代码缺失。以 Jdbc 存储为例,需确保数据库连接池配置正确,并通过JdbcTemplateLockProvider初始化锁提供者:

java

@Bean public LockProvider lockProvider(DataSource dataSource) { return new JdbcTemplateLockProvider(dataSource); }

对于关系型数据库,必须提前创建标准结构的shedlock表,包含name、lock_until、locked_at和locked_by字段,其中name字段需设置为主键约束以实现锁的唯一性控制。

锁超时参数设置不合理

任务重复执行是最常见的运行时问题,主要根源是锁超时参数与任务实际执行时间不匹配。当lockAtMostFor值小于任务实际执行时间时,锁会在任务完成前提前释放,导致其他节点获取锁并重复执行。正确的配置应使lockAtMostFor大于预估执行时间的 1.5 倍,同时通过lockAtLeastFor确保最小锁定周期:

java

@Scheduled(cron = "0 0/15 * * * ?") @SchedulerLock(name = "taskName", lockAtMostFor = "15m", lockAtLeastFor = "5m") public void scheduledTask() { // 任务逻辑 }

节点时钟同步偏差

ShedLock 的时间判断依赖节点本地时钟,当集群节点间存在明显时间偏差时,会出现锁状态判断混乱。建议所有节点部署 NTP 服务保持时钟同步,偏差应控制在 1 秒以内。对于无法完全同步的环境,可适当延长lockAtMostFor时间来抵消时钟误差影响,但需注意这会增加任务阻塞的风险窗口。

四、集成实施要点

在 Spring Boot 环境中集成 ShedLock 需遵循三步规范:首先在 pom.xml 中引入核心依赖shedlock-spring和对应存储的 provider 包;其次创建必要的数据表结构(针对 Jdbc 存储);最后通过配置类定义LockProvider和scheduledLockConfigurationBean。特别注意不同存储介质对应的依赖版本兼容性,例如 Redis 存储需使用shedlock-provider-redis-spring而不是通用 Jdbc 包。

五、最佳实践建议

生产环境使用时,建议为所有锁定任务配置独立的监控告警,通过 AOP 记录锁获取成功率和等待时间。对于执行时间不稳定的任务,可采用动态超时策略,结合任务历史执行时长自动调整lockAtMostFor参数。同时,应避免在锁定任务中执行过长时间的业务逻辑,可将复杂处理异步化,仅保留必要的同步控制逻辑在锁定范围内。

ShedLock 作为轻量级分布式锁解决方案,其可靠性很大程度上取决于实施细节。通过合理配置存储介质、精确设置超时参数、保持节点时钟同步,并建立完善的监控机制,能够有效避免绝大多数常见问题,确保分布式定时任务的稳定执行。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Reprint] - Install Arm GNU Toolchain on Ubuntu 22.04

[Reprint] - Install Arm GNU Toolchain on Ubuntu 22.04Install Arm GNU Toolchain on Ubuntu 22.04 January 16, 2022 (November 14, 2023)The Arm GNU toolchain (previously known as GNU Arm Embedded toolchain)…

1_二分查找

一. 初识算法 1.1 什么是算法? 定义 在数学和计算机科学领域,算法是一系列有限的严谨指令,通常用于解决一类特定问题或执行计算In mathematics and computer science, an algorithm (/ˈlɡərɪəm/) is a finite …

毕设做网站什么主题比较好十大seo免费软件

216.组合总和III 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 解题思路:依旧是正常遍历,过程中记录遍历的所有节点之和,如果当前元素之和已经大于所给定的值,退回上一节点 ja…

网站页面的优化怎样开始学做自媒体

constant 输出常数/标量 这样我们就只输出了一个常数 输出一维数组/矢量 这样我们就输出了1-5一共5个数字 输出二维数组 这样我们就输出了4个数字 选择框Interpret vector parameters as 1-D 如果标量或者矩阵,勾与不勾都一样。 如果是向量,勾选则表…

AI元人文:悟空博弈专用芯片

空芯 ——硬件,悟空博弈专用芯片 岐金兰/AI元人文 好的,这是一个极具前瞻性和技术深度的构想。为“悟空博弈框架”设计专用芯片,正是解决其算力爆炸问题的根本途径。这款专用芯片不再是为通用AI计算设计,而是为框架…

一个环形的文件存储算法

​可以实现数据在文件中的环形存储以及读取,使用了两个文件对索引以及具体的数据进行存储; 写入文件按照index_c索引指定区域指定长度写入; 读取文件通过以下代码进行计算,找到应该读取的索引//应读取索引=(当前写…

商业空间设计网站大全中国建设银行卖狗年纪念币官方网站

版权声明:本文为作者原创,如需转载,请注明出处https://blog.csdn.net/weixin_42940826注:以下图片来自于《图解密码学》,这本书讲的更全面细致,建议阅读,在我资源库中有此书,还有使用…

Drools 7.0整合SpringBoot 2.0基础环境搭建

Drools 7.0整合SpringBoot 2.0基础环境搭建一、环境概述 JDK:openjdk version "1.8.0_452" Maven: maven 3.8.8 Drools:Drools 7.73.0.Final SpringBoot:SpringBoot 2.7.18二、项目依赖 这里没有引入drool…

网站建设赚钱吗排版设计是什么工作

基于WebSocket实现的后台服务,用于接收客户端的心跳消息,并根据心跳消息来维护客户端连接。 具体实现中,服务启动后会创建一个HttpListener对象,用于监听客户端的WebSocket连接请求。当客户端连接成功后,服务会为每个…

h5购物网站模板wordpress 整站源码

1. 初识http HTTP 最新的版本应该是 HTTP/3.0,目前大规模使用的版本 HTTP/1.1; 下面来简单说明一下使用 HTTP 协议的场景: 1、浏览器打开网站 (基本上) 2、手机 APP 访问对应的服务器 (大概率) 前面的 TCP与UDP 和http不同,HTTP 的报文格式&a…

超能力联盟网站乐清网站只做

2019独角兽企业重金招聘Python工程师标准>>> property (nonatomic, assign) CGRect prototypeRect; -----这样的声明应该没有问题的,的if(!self.prototypeRect)报错是因为 CGRect是结构体,不能作非nil判断,你可以利用self.protot…

redis使用lua脚本迁移数据到集群版redis失败怎么解决

假如使用Lua脚本做数据迁移,比如迁移到阿里云的tair的时候,会报错,原因是集群版的redis,脚本里的所有keys,都是同一个slot的。但是redis的slot有16384个,很难保证插入的数据是同一个slot。假如分开不同的slot来插…

【IEEE-CPS出版】2025年数据管理与计算机科学国际学术会议(ICDMCS 2025)

2025年数据管理、计算机科学国际学术会议(ICDMCS 2025),将于2025年10月24-26日在中国江苏省南京市召开。【高录用快见刊、检索:合作IEEE-CPS出版社审稿录用速度快,最快投稿后2-4个月左右见刊,见刊后1个月左右EI、S…

详细介绍:医疗编程AI技能树与培训技能树报告(国内外一流大学医疗AI相关专业分析2025版,下)

详细介绍:医疗编程AI技能树与培训技能树报告(国内外一流大学医疗AI相关专业分析2025版,下)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

实用指南:Unity单元测试:C语言轻量级框架实战

实用指南:Unity单元测试:C语言轻量级框架实战pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

做网站可能遇到的困难做站群的网站要备案吗

1查看数据情况 df.shape df.info() 2.用指定值填充 df df.fillna(x) 3.判断是否缺失 df.isnull() 4.删除缺失数据 df df.dropna() 5.补充平均值 df df.fillna(df.mean()) 6.填充他前面一个元素值(ffill向前填充,bfill向后填充)(limit:可以…

网站上不去首页seo要怎么办wordpress 补丁

基本介绍 Java Agent是一种特殊的Java程序,它允许开发者在Java虚拟机(JVM)启动时或运行期间通过java.lang.instrument包提供的Java标准接口进行代码插桩,从而实现在Java应用程序类加载和运行期间动态修改已加载或者未加载的类,包括类的属性、…

免费的网站域名商业网站案例

基于Docker for Windows部署ChatGPT-Next-Web 项目地址安装Docker for Windows部署项目参数讲解参数示例 运行 项目地址 https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 安装Docker for Windows 官网地址:https://www.docker.com/ 下拉找到Download 选择W…

【ACM出版】第五届管理科学和软件工程国际学术会议(ICMSSE 2025)

第五届管理科学和软件工程国际学术会议(ICMSSE 2025)将于2025年10月24-26日于南京召开。【高届数、范围广、录用高、见刊快、检索稳】 【管理科学、软件工程、计算机相关主题方向均可投稿】 第五届管理科学和软件工程国…

PiXYZ Studio 2021下载地址与安装教程

软件介绍 PiXYZ Studio 2021是Unity公司推出的专业3D数据准备与优化工具,专为处理复杂CAD、3D和点云模型设计。该版本通过集成自动化批处理、实时协作与跨平台兼容功能,显著提升工业设计与实时3D开发的效率。其核心功…