SpringBoot整合ShedLock处理定时任务重复⏰🔒
在分布式系统中,定时任务重复执行是一个常见问题😫。当多个服务实例同时运行时,同一个定时任务可能会被多次触发,导致数据不一致或资源浪费。今天我们就来聊聊如何用ShedLock解决这个问题!💡
什么是ShedLock?🤔
ShedLock是一个轻量级的分布式锁库,确保你的定时任务在同一时间只在一个节点上执行🚀。它通过在数据库中创建一个锁表来协调各个实例。
整合步骤🛠️
1.首先添加依赖:
```xml
net.javacrumbs.shedlock
shedlock-spring
4.42.0
net.javacrumbs.shedlock
shedlock-provider-jdbc-template
4.42.0
```
2.配置ShedLock:
```java
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor="PT30S")
publicclassShedLockConfig{
@Bean
publicLockProviderlockProvider(DataSourcedataSource){
returnnewJdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(newJdbcTemplate(dataSource))
.usingDbTime()//使用数据库时间
.build()
);
}
}
```
3.创建锁表(MySQL示例):
```sql
CREATETABLEshedlock(
nameVARCHAR(64)PRIMARYKEY,
lock_untilTIMESTAMP(3)NULL,
locked_atTIMESTAMP(3)NULL,
locked_byVARCHAR(255)
);
```
4.使用@SchedulerLock注解:
```java
@Scheduled(cron="0/5?")//每5分钟执行
@SchedulerLock(name="reportTask",lockAtLeastFor="PT5M",lockAtMostFor="PT10M")
publicvoidgenerateReport(){
//你的业务逻辑
log.info("生成报表任务执行中...📊");
}
```
参数说明📝
-`lockAtLeastFor`:最短锁定时间,防止任务执行过快导致重复
-`lockAtMostFor`:最长锁定时间,防止节点崩溃导致锁永远不释放
总结🎯
通过ShedLock,我们轻松解决了分布式环境下的定时任务重复问题!👏它简单易用,支持多种存储方式(JDBC、Mongo、Redis等),是分布式定时任务的理想选择。快去试试吧!💻✨
在分布式系统中,定时任务重复执行是一个常见问题😫。当多个服务实例同时运行时,同一个定时任务可能会被多次触发,导致数据不一致或资源浪费。今天我们就来聊聊如何用ShedLock解决这个问题!💡
什么是ShedLock?🤔
ShedLock是一个轻量级的分布式锁库,确保你的定时任务在同一时间只在一个节点上执行🚀。它通过在数据库中创建一个锁表来协调各个实例。
整合步骤🛠️
1.首先添加依赖:
```xml
net.javacrumbs.shedlock
shedlock-spring
4.42.0
net.javacrumbs.shedlock
shedlock-provider-jdbc-template
4.42.0
```
2.配置ShedLock:
```java
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor="PT30S")
publicclassShedLockConfig{
@Bean
publicLockProviderlockProvider(DataSourcedataSource){
returnnewJdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(newJdbcTemplate(dataSource))
.usingDbTime()//使用数据库时间
.build()
);
}
}
```
3.创建锁表(MySQL示例):
```sql
CREATETABLEshedlock(
nameVARCHAR(64)PRIMARYKEY,
lock_untilTIMESTAMP(3)NULL,
locked_atTIMESTAMP(3)NULL,
locked_byVARCHAR(255)
);
```
4.使用@SchedulerLock注解:
```java
@Scheduled(cron="0/5?")//每5分钟执行
@SchedulerLock(name="reportTask",lockAtLeastFor="PT5M",lockAtMostFor="PT10M")
publicvoidgenerateReport(){
//你的业务逻辑
log.info("生成报表任务执行中...📊");
}
```
参数说明📝
-`lockAtLeastFor`:最短锁定时间,防止任务执行过快导致重复
-`lockAtMostFor`:最长锁定时间,防止节点崩溃导致锁永远不释放
总结🎯
通过ShedLock,我们轻松解决了分布式环境下的定时任务重复问题!👏它简单易用,支持多种存储方式(JDBC、Mongo、Redis等),是分布式定时任务的理想选择。快去试试吧!💻✨

被折叠的 条评论
为什么被折叠?



