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

SpringBoot整合ShedLock处理定时任务重复问题⏰🔒

在分布式系统中,定时任务重复执行是一个常见痛点😫。当多个服务实例同时运行时,简单的`@Scheduled`注解会导致任务被多次触发。今天我们就来聊聊如何用ShedLock解决这个问题!✨

什么是ShedLock?🤔

ShedLock是一个轻量级的分布式锁库,它能确保你的定时任务在同一时间只在一个节点上执行。它支持多种存储后端,包括JDBC、Redis、MongoDB等。

整合步骤📝

1.添加依赖

首先在`pom.xml`中添加依赖:

```xml

net.javacrumbs.shedlock
shedlock-spring
4.44.0

net.javacrumbs.shedlock
shedlock-provider-jdbc-template
4.44.0

```

2.创建锁表(以MySQL为例)

```sql
CREATETABLEshedlock(
nameVARCHAR(64)PRIMARYKEY,
lock_untilTIMESTAMP(3)NULL,
locked_atTIMESTAMP(3)NULL,
locked_byVARCHAR(255)
);
```

3.配置ShedLock

```java
@Configuration
publicclassShedLockConfig{

@Bean
publicLockProviderlockProvider(DataSourcedataSource){
returnnewJdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(newJdbcTemplate(dataSource))
.usingDbTime()//使用数据库时间
.build()
);
}
}
```

4.使用ShedLock注解

```java
@Service
publicclassMyScheduledService{

@Scheduled(cron="0/5")//每5分钟执行一次
@SchedulerLock(name="myScheduledTask",
lockAtLeastFor="4m",//至少锁定4分钟
lockAtMostFor="5m")//最多锁定5分钟
publicvoidmyScheduledTask(){
//你的业务逻辑
System.out.println("任务执行时间:"+newDate()+"");
}
}
```

关键点说明🔍

-`@SchedulerLock`的name属性必须是唯一的
-`lockAtLeastFor`防止短周期任务重复执行
-`lockAtMostFor`是防止节点崩溃时锁永远不释放的安全机制

总结

通过ShedLock,我们轻松解决了分布式环境下的定时任务重复执行问题💪。它配置简单、支持多种存储、轻量高效,是处理此类问题的绝佳选择!

下次遇到定时任务重复执行时,记得试试ShedLock哦😉!

相关推荐
明月(Alioo)19 分钟前
给 AI Agent 装上“大脑“:Java语言中Code Interpreter 的设计与实现
java·ai·agent
QuZero22 分钟前
StampedLock Mechanism
java·算法
Javatutouhouduan24 分钟前
Java小白如何快速玩转Redis?
java·数据库·redis·分布式锁·java面试·后端开发·java程序员
xuhaoyu_cpp_java25 分钟前
Spring学习(一)
java·经验分享·笔记·学习·spring
陈随易34 分钟前
为什么今天还会有新语言?MoonBit 想解决什么问题?
前端·后端·程序员
Cosolar37 分钟前
大型语言模型(LLM)微调与量化技术全指南——从预训练到高效部署
人工智能·后端·面试
SamDeepThinking1 小时前
代码能跑就别动?有AI之后其实未必
后端·程序员·ai编程
kybs19911 小时前
springboot视频推荐系统--附源码72953
java·spring boot·python·eclipse·asp.net·php·idea
无限进步_1 小时前
C++ 多态机制完全解析:从虚函数重写到动态绑定原理
java·c语言·jvm·数据结构·c++·windows·后端
知识汲取者2 小时前
巨量引擎 Marketing API Java SDK 介绍
java·开发语言