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