lukas-krecan/ShedLock
说明与用途
**项目简介(2‑3 句)**
ShedLock 是一个基于分布式锁的库,帮助在多实例部署的环境中确保 **Spring、Quartz、Micronaut 等框架的定时任务只会被单个实例执行**,从而避免重复执行和资源竞争。
**价值**
- **防止任务重复**:在 Kubernetes、Docker Swarm、云服务器等水平扩展的场景下,自动为同一调度任务加锁,保证业务逻辑只跑一次。
- **实现简单**:只需在已有的
@Scheduled(或对应框架)方法上加上@SchedulerLock注解,底层通过 JDBC、MongoDB、Redis、Zookeeper 等持久化介质实现锁的获取与释放。 - **兼容性强**:支持 Java 8+,可与 Spring Boot、Spring Cloud、Micronaut、Quarkus 等主流生态无缝集成。
**典型接入方式**
- **引入依赖**(以 Spring Boot 为例)
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>5.10.0</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>5.10.0</version>
</dependency>- **配置锁存储**(以数据库为例)
spring.datasource.url=jdbc:postgresql://host/db
spring.datasource.username=...
spring.datasource.password=... 并在 @Configuration 中声明 LockProvider:
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource);
}- **为任务加锁**
@Scheduled(cron = "0 */5 * * * *")
@SchedulerLock(name = "myTask", lockAtMostFor = "PT4M", lockAtLeastFor = "PT1M")
public void myTask() {
// 业务代码
}**生产可用性**
- **成熟度**:已有 4 k+ stars、500+ forks,社区活跃,最近一次提交在 2026‑05‑14,表明仍在维护。
- **适用场景**:适合内部系统、原型或对任务唯一性有强需求的生产环境(如报表生成、批量同步、限流任务等)。
- **风险与注意点**:
- 需要自行选择并部署锁的持久化介质(数据库、Redis、MongoDB 等),确保其高可用性。
- 对锁的超时(
lockAtMostFor)和最短持有时间(lockAtLeastFor)要根据业务容忍度进行调优,防止因锁未及时释放导致任务“卡死”。 - 在极高并发或跨语言系统中,需评估锁实现的性能和一致性模型(如 Redis 的单节点 vs 集群)。
总体而言,ShedLock 在保证分布式调度任务唯一执行方面提供了 **轻量、易集成且经过社区验证的解决方案**,只要做好存储层的可靠性和锁超时策略,就可以在生产环境中安全使用。
实际用途
lukas-krecan/ShedLock may be useful when its README and activity match a concrete workflow.
限制与审查说明
Medium: useful for prototypes or internal workflows, with dependency and maintenance checks before production.
- 来源: github
- 语言: Java
- 记录日期: 2026-09-05T17:31:33.812Z