如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次
之前在Spring Boot教程中我们介绍了如何用 @Scheduled 注解来创建定时任务,Spring 的任务调度用起来确实顺手。可这种实现方式一上多实例(比如多副本部署),同一个定时任务会在每个节点都跑一遍,等于任务会重复执行。
原因很简单:默认情况下,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