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哦😉!

相关推荐
ServBay1 小时前
Laravel Herd MCP 的替代,多语言与跨平台的 AI 本地开发选择
后端·ai编程·mcp
GoGeekBaird2 小时前
Prompt、Context、Harness 工程全景图
后端
SimonKing2 小时前
艹,维护AI写的代码,我心态崩了......
java·后端·程序员
AskHarries2 小时前
MCP 基础:Server、Tool、Resource 和 Prompt
后端·程序员
长栎2 小时前
你写的 DCL 单例,在反序列化面前就是个弟弟——单例模式的破局与重建
后端
长栎2 小时前
命令模式和策略模式代码长一样——你分不清是因为你没看穿它们的本质
后端
用户298698530142 小时前
Java Word 文档样式进阶:段落与文本背景色设置完全指南
java·后端
苍何2 小时前
开源个狠活,世界杯 AI 模型竞技场!
后端
Dilee2 小时前
Spring AI 1.1.7 接入 MCP:Filesystem Server 最小 Demo
人工智能·后端