news 2026/6/10 15:09:56

如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次

执行。

原因很简单:默认情况下,Spring 不会在多个实例之间做调度同步。

这篇文章就聊聊怎么用 ShedLock,让定时任务在多实例环境下“同一时刻只跑一次”。顺便一提,它也能作为 Quartz 的替代。

Maven 依赖

先引入 shedlock-spring 这个依赖:

<dependency>

<groupId>net.javacrumbs.shedlock</groupId>

<artifactId>shedlock-spring</artifactId>

<version>6.3.1</version>

</dependency>

最新版本可以去 Maven Central 看。

配置

ShedLock 依赖“共享数据库”,并且要声明一个合适的 LockProvider。它会在库里新建一张表/文档,记录当前的锁。

目前它支持 Mongo、Couchbase、Elasticsearch、Redis、Hazelcast、ZooKeeper、Cassandra,以及任何带 JDBC 驱动的数据库。

示例我们用内存型 H2 数据库,方便演示。

要跑起来,先把 H2 和 JDBC 版的 ShedLock 依赖加上:

<dependency>

<groupId>net.javacrumbs.shedlock</groupId>

<artifactId>shedlock-provider-jdbc-template</artifactId>

<version>6.3.1</version>

</dependency>

<dependency>

<groupId>com.h2database</groupId>

<artifactId>h2</artifactId>

<version>2.1.214</version>

</dependency>

然后建一张表,专门存锁:

CREATE TABLE shedlock (

name VARCHAR(64),

lock_until TIMESTAMP(3) NULL,

locked_at TIMESTAMP(3) NULL,

locked_by VARCHAR(255),

PRIMARY KEY (name)

)

在 Spring Boot 里把数据源写到配置里,这样 DataSource 才能被注入。这里用 application.yml:

spring:

datasource:

driverClassName: org.h2.Driver

url: jdbc:h2:mem:shedlock_DB;INIT=CREATE SCHEMA IF NOT EXISTS shedlock;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

username: sa

password:

接着用这个数据源配置下 LockProvider,写法很直观:

@Configuration

public class SchedulerConfiguration {

@Bean

public LockProvider lockProvider(DataSource dataSource) {

return new JdbcTemplateLockProvider(dataSource);

}

}

别忘了再加上两个注解:@EnableScheduling 和 @EnableSchedulerLock:

@SpringBootApplication

@EnableScheduling

@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")

public class SpringBootShedlockApplication {

public static void main(String[] args) {

SpringApplication.run(SpringBootShedlockApplication.class, args);

}

}

defaultLockAtMostFor 表示执行节点挂了时,锁最多保留多久。格式用的是 ISO8601 持续时间。

下面的示例会演示怎么在方法上覆盖它。

创建任务

让 ShedLock 接管一个定时任务很简单:方法上同时加 @Scheduled 和 @SchedulerLock:

@Component

class BaeldungTaskScheduler {

@Scheduled(cron = "0 0/15 * * * ?")

@SchedulerLock(name = "TaskScheduler_scheduledTask",

lockAtLeastFor = "PT5M", lockAtMostFor = "PT14M")

public void scheduledTask() {

// ...

}

}

先说 @Scheduled:它支持 cron 表达式,上面的表达式表示“每 15 分钟执行一次”。

再说 @SchedulerLock:name 要唯一,一般用 类名_方法名 就够了。我们不希望同一个方法被同时运行,ShedLock 就是靠这个唯一名称来实现的。

我们还加了两个可选参数:

lockAtLeastFor 用来保证最少持锁时间,让两次执行之间留出一定间隔。使用 “PT5M” 表示至少 5 分钟。换句话说,这个方法被 ShedLock 控制后,运行频率不会高于每 5 分钟一次。

lockAtMostFor 用来指定在执行节点异常(比如宕机)时,锁最多会被保留多久。使用 “PT14M” 表示最多 14 分钟。

正常情况下任务结束会立即释放锁。其实在 @EnableSchedulerLock 里已经有默认值,这里只是展示如何在方法级别做覆盖。

总结

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 17:42:18

用格子玻尔兹曼方法(LBM)模拟不可压缩密度守恒压力驱动流

格子玻尔兹曼方法&#xff08;LBM&#xff09;模拟不可压缩密度守恒压力驱动流&#xff0c;MATLAB代码嘿&#xff0c;大家好&#xff01;今天来聊聊如何使用格子玻尔兹曼方法&#xff08;LBM&#xff09;模拟不可压缩密度守恒压力驱动流&#xff0c;并且会用MATLAB代码来实现。…

作者头像 李华
网站建设 2026/6/4 18:22:28

基于LQR控制算法的四轮独立电驱动汽车横向稳定性控制研究

适用方向&#xff1a;基于LQR控制算法的直接横摆力矩控制&#xff08;DYC&#xff09;的四轮独立电驱动汽车的横向稳定性控制研究 主要内容&#xff1a;利用carsim建模&#xff0c;在simulink中搭建控制器&#xff0c;然后进行联合。 实现汽车在高速低附着路面下完成双移线工况…

作者头像 李华
网站建设 2026/6/5 3:40:07

IPv6违规外联防御指南:从风险盲区到可管可控

在数字化转型加速推进的今天&#xff0c;IPv6作为下一代互联网协议&#xff0c;正以其庞大的地址空间和高效的通信机制&#xff0c;推动着网络基础设施的全面升级。根据APNIC监测数据&#xff0c;2022年全球IPv6支持能力持续增强&#xff0c;支持率从2021年3月的28.31%显著提升…

作者头像 李华
网站建设 2026/6/9 19:40:50

网型逆变器小干扰稳定性分析与控制策略优化:Simulink仿真探索

跟网型逆变器小干扰稳定性分析与控制策略优化simulink仿真模型和代码 现代逆变技术 阻抗重塑 双锁相环 可附赠参考文献&#xff08;英文&#xff09; 和一份与模型完全对应的中文版报告在现代逆变技术的领域中&#xff0c;网型逆变器的小干扰稳定性分析以及控制策略的优化是至关…

作者头像 李华
网站建设 2026/6/8 20:12:24

非支配排序多目标鲸鱼优化算法(NSWOA) Matlab实现探索

非支配排序多目标鲸鱼优化算法(NSWOA) Matlab实现测试函数包括ZDT、DTLZ、WFG、CF和UF共46个等&#xff0c;另外附有一个工程应用案例&#xff1b;评价指标包括超体积度量值HV、反向迭代距离IGD、迭代距离GD和空间评价SP等可提供相关多目标算法定制、创新和改进多目标算法与预测…

作者头像 李华
网站建设 2026/6/10 9:14:20

Solon Plugin 自动装配机制详解

在现代Java生态中&#xff0c;框架的扩展能力是衡量其灵活性和强大程度的重要指标。Solon框架作为一款新兴的Java企业级应用开发框架&#xff0c;其插件扩展机制提供了一种“编码风格”的扩展体系&#xff0c;使开发者能够以更自由、更灵活的方式增强框架功能。一、Solon Plugi…

作者头像 李华