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

相关推荐
Miao121311 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
码事漫谈1 小时前
告别数据孤岛与AI“水土不服”:金仓多模融合时序库如何让数据真正服务于业务
后端
IT_陈寒1 小时前
Redis的持久化配置把我坑惨了:你以为数据安全了?
前端·人工智能·后端
星栈2 小时前
Node 接口该写同步还是异步?
后端·node.js
红烧大青虫2 小时前
HarmonyOS应用开发实战:小事记 - UIAbility 的冷启动/热启动/后台启动三种场景与 launchParam 解析
后端·华为·harmonyos·鸿蒙系统
码事漫谈2 小时前
AI Token 缓存:命中省 10 倍,不命中白扔钱
后端
CRMEB系统商城2 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
65岁退休Coder2 小时前
LangChain v1.3.4 笔记 - 04 Agent 中间件
后端
keyipatience3 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
神奇小汤圆3 小时前
一个接口多个实现,Spring 怎么"适配多场景"?
后端