news 2026/6/22 22:24:57

如何用 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/23 6:35:43

基于MPC的永磁同步电机非线性终端滑模控制仿真研究

基于MPC的永磁同步电机非线性终端滑模控制仿真研究 matlab simulink 无参考文件在电机控制领域&#xff0c;永磁同步电机&#xff08;PMSM&#xff09;以其高效、高功率密度等优点&#xff0c;广泛应用于工业、交通等诸多领域。为了实现PMSM更加精准、高效的控制&#xff0c;各…

作者头像 李华
网站建设 2026/6/14 8:32:02

ISSA - CNN - BiLSTM多输入单输出回归的Python实现与改进

ISSA多策略改进麻雀优化ISSA-CNN-BiLSTM 多输入单输出回归 python代码 优化参数&#xff1a;filter,unints1,units2&#xff0c;学习率&#xff08;可添加&#xff09; 以下是三个主要的改进点&#xff1a; sin混沌映射&#xff1a; sin混沌映射初始化种群&#xff0c;这是一种…

作者头像 李华
网站建设 2026/6/17 18:56:50

Q学习(Q-learning)路径规划算法实战

Q学习&#xff08;Q-learning&#xff09;路径规划算法。 matlab代码。 智能体与环境交互来更新Q值表。 可以通过窗口界面方便观察交互过程 非4栅格拓展&#xff01;智能体可以在一个栅格向8个方向拓展。 代码注释详尽&#xff0c;可以方便替换自己的地图。 #路径规划 #强化学习…

作者头像 李华
网站建设 2026/6/21 21:51:56

ANSYS/LS - dyna防爆涂层砂浆砖框架结构爆破荷载损伤响应案例探索

ANSYS/LS-dyna防爆涂层砂浆砖框架结构爆破荷载损伤响应案例 1.GUI模式快速建立砂浆砖模型&#xff0c;易上手&#xff0c;灵活度高。 2.采用壳单元法、实体单元法两种方法考虑防爆涂层的作用效果。 3.讲述砂浆砖模型如何进一步嵌入实体框架当中&#xff0c;包含模型关键字导入&…

作者头像 李华
网站建设 2026/6/23 19:48:00

基于TOA/FOA的无源定位方法MATLAB仿真探索

MATLAB仿真 基于toa/foa的无源定位方法&#xff0c;二次等式约束求解 有 参考文档 无源定位技术&#xff1a;二次等式约束最小二乘估计理论与方法 第八章在无线定位领域&#xff0c;基于TOA&#xff08;Time of Arrival&#xff0c;到达时间&#xff09;和FOA&#xff08;Frequ…

作者头像 李华
网站建设 2026/6/23 1:08:08

基于一致性算法改进的自适应虚拟阻抗控制:解决双机并联功率分布不均

基于一致性算法改进的自适应虚拟阻抗控制研究&#xff0c;可以完美实现双机并联后线路阻抗引起的功率分布不均&#xff0c;下垂控制在电力系统的双机并联场景中&#xff0c;线路阻抗带来的功率分布不均一直是个令人头疼的问题。不过&#xff0c;通过基于一致性算法改进的自适应…

作者头像 李华