news 2026/4/16 17:55:12

如何用 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/4/16 3:29:32

Colima 下 docker pull 失败自查流程

macOS Colima 下 docker pull 超时问题排查总结 一、问题现象 在 macOS 上使用 colima 运行 Docker service 时&#xff0c;执行&#xff1a; docker pull BALABALA报错&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http…

作者头像 李华
网站建设 2026/4/16 9:23:15

基于springboot的健身房预约与学习管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

作者头像 李华
网站建设 2026/4/16 9:23:10

STM32H723 芯片基本配置指南:从新手到专家的进阶之路

引言 作为一名初次接触 STM32H723 芯片的开发者,我在基本配置过程中遇到了不少挑战和困惑。这款高性能的 Cortex-M7 微控制器虽然功能强大,但复杂的配置选项和参数设置确实让人望而生畏。经过一番摸索和实践,我终于掌握了正确的配置方法。今天,我将通过这篇博客,分享我在…

作者头像 李华
网站建设 2026/4/16 16:07:36

探索Comsol中三维结构声子晶体的禁带与传输特性

Comsol 三维结构声子晶体禁带及其传输特性。在材料科学和物理学领域&#xff0c;声子晶体因其独特的声学性质而备受关注。特别是三维结构声子晶体&#xff0c;它在控制声波传播方面展现出巨大的潜力。今天咱们就借助Comsol这个强大的工具&#xff0c;来深入探究三维结构声子晶体…

作者头像 李华
网站建设 2026/4/16 11:01:54

探索 PEM 电解槽三维两相流模拟:基于 Comsol 仿真的奇妙之旅

comsol仿真 PEM电解槽三维两相流模拟&#xff0c;包括电化学&#xff0c;两相流传质&#xff0c;析氢析氧&#xff0c;化学反应热等多物理场耦合&#xff0c;软件comsol&#xff0c;可分析多孔介质传质&#xff0c;析氢析氧过程对电解槽电流密度分布&#xff0c;氢气体积分数…

作者头像 李华
网站建设 2026/4/16 10:52:53

C语言运算符笔记

赋值运算符将不满意的值赋值为自己满意的值&#xff0c;赋值运算符可以连续使用&#xff08;链式赋值&#xff09;。 示例&#xff1a; int a10; int x0; int y20; a x y 1; // 链式赋值 复合赋值符、-、*、/、%、>>、<<、&、|、^单目/双目运算符• 单目运算…

作者头像 李华