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

相关推荐
奋进的芋圆20 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin20 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model200520 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
武藤一雄20 小时前
C# 关于多线程如何实现需要注意的问题(持续更新)
windows·后端·microsoft·c#·.net·.netcore·死锁
荒诞硬汉20 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国21 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_9418824821 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈21 小时前
两天开发完成智能体平台
java·spring·go
程序新视界21 小时前
为什么不建议基于Multi-Agent来构建Agent工程?
人工智能·后端·agent
alonewolf_9921 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc