SpringBoot整合ShedLock处理定时任务重复问题⏰🔒
在分布式系统中,定时任务重复执行是一个常见痛点😫。当多个服务实例同时运行时,传统的`@Scheduled`注解会导致任务被多次触发。今天我们就用ShedLock来解决这个问题!💪
什么是ShedLock?🤔
ShedLock是一个轻量级的分布式锁库,确保你的定时任务在同一时间只会执行一次。它支持多种存储方式,包括:
-JDBC数据库🗄️
-Redis🛢️
-ZooKeeper🐘
-MongoDB📄
快速集成到SpringBoot🚀
首先添加依赖:
```xml
net.javacrumbs.shedlock
shedlock-spring
4.42.0
net.javacrumbs.shedlock
shedlock-provider-jdbc-template
4.42.0
```
配置ShedLock(以JDBC为例):
```java
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor="PT30S")
publicclassShedLockConfig{
@Bean
publicLockProviderlockProvider(DataSourcedataSource){
returnnewJdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(newJdbcTemplate(dataSource))
.usingDbTime()//使用数据库时间
.build()
);
}
}
```
别忘了创建锁表(MySQL示例):
```sql
CREATETABLEshedlock(
nameVARCHAR(64)PRIMARYKEY,
lock_untilTIMESTAMP(3)NULL,
locked_atTIMESTAMP(3)NULL,
locked_byVARCHAR(255)
);
```
使用示例✨
```java
@Service
publicclassScheduledTasks{
@Scheduled(cron="0/5")//每5分钟执行
@SchedulerLock(name="reportTask",lockAtLeastFor="PT5M",lockAtMostFor="PT14M")
publicvoidgenerateReport(){
//你的业务逻辑
System.out.println("生成报表中..."+newDate());
}
}
```
关键参数说明:
-`name`:锁的唯一标识🔑
-`lockAtLeastFor`:最短锁定时间⏳
-`lockAtMostFor`:最长锁定时间(防止死锁)⏰
总结🎯
通过ShedLock,我们轻松解决了分布式环境下的定时任务重复执行问题。它配置简单、支持多种存储,是处理此类场景的绝佳选择!👍快去试试吧!💻
>提示:生产环境中建议结合具体业务调整锁定时长,并做好异常处理哦!⚠️
在分布式系统中,定时任务重复执行是一个常见痛点😫。当多个服务实例同时运行时,传统的`@Scheduled`注解会导致任务被多次触发。今天我们就用ShedLock来解决这个问题!💪
什么是ShedLock?🤔
ShedLock是一个轻量级的分布式锁库,确保你的定时任务在同一时间只会执行一次。它支持多种存储方式,包括:
-JDBC数据库🗄️
-Redis🛢️
-ZooKeeper🐘
-MongoDB📄
快速集成到SpringBoot🚀
首先添加依赖:
```xml
net.javacrumbs.shedlock
shedlock-spring
4.42.0
net.javacrumbs.shedlock
shedlock-provider-jdbc-template
4.42.0
```
配置ShedLock(以JDBC为例):
```java
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor="PT30S")
publicclassShedLockConfig{
@Bean
publicLockProviderlockProvider(DataSourcedataSource){
returnnewJdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(newJdbcTemplate(dataSource))
.usingDbTime()//使用数据库时间
.build()
);
}
}
```
别忘了创建锁表(MySQL示例):
```sql
CREATETABLEshedlock(
nameVARCHAR(64)PRIMARYKEY,
lock_untilTIMESTAMP(3)NULL,
locked_atTIMESTAMP(3)NULL,
locked_byVARCHAR(255)
);
```
使用示例✨
```java
@Service
publicclassScheduledTasks{
@Scheduled(cron="0/5")//每5分钟执行
@SchedulerLock(name="reportTask",lockAtLeastFor="PT5M",lockAtMostFor="PT14M")
publicvoidgenerateReport(){
//你的业务逻辑
System.out.println("生成报表中..."+newDate());
}
}
```
关键参数说明:
-`name`:锁的唯一标识🔑
-`lockAtLeastFor`:最短锁定时间⏳
-`lockAtMostFor`:最长锁定时间(防止死锁)⏰
总结🎯
通过ShedLock,我们轻松解决了分布式环境下的定时任务重复执行问题。它配置简单、支持多种存储,是处理此类场景的绝佳选择!👍快去试试吧!💻
>提示:生产环境中建议结合具体业务调整锁定时长,并做好异常处理哦!⚠️
ShedLock解决定时任务重复
513

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



