当前位置: 首页 > article >正文

SpringBoot中@SchedulerLock注解实现定时任务中分布式锁的使用

背景

在SpringBoot项目中经常会去写一些定时任务,但是当我们的服务的实例部署多个的情况下,那么每个实例中的定时任务都会执行一遍,这显然不是我们想要的,我们只想让它执行一次。在没有引入像xxl-job之类的分布式任务调度框架的前提下,并且我们也不想对业务代码进行侵入,那么可以选择shedlock进行尝试使用。

  1. 第一步:引入相关依赖
		<dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-spring</artifactId>
            <version>4.14.0</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>net.javacrumbs.shedlock</groupId>-->
<!--            <artifactId>shedlock-provider-jdbc-template</artifactId>-->
<!--            <version>4.14.0</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-provider-redis-spring</artifactId>
            <version>2.5.0</version>
        </dependency>

这里说明一下:ShedLock是支持多种方式进行数据存储的,具体的详情可以看下Github的文档说明:文档
,因为我们项目里面已经引入并使用了Redis,所以我这里就选择了Redis作为存储。所以上边的依赖我也是使用了redis的provider的支持。

  1. 第二步,添加配置类
@Configuration
public class ScheduledLockConfig {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Bean
    public LockProvider lockProvider() {
        return new RedisLockProvider(stringRedisTemplate.getConnectionFactory());
    }
}
  1. 第三步,在启动类上添加注解,否则不会生效
@EnableSchedulerLock(defaultLockAtMostFor = "PT10M")
  1. 第四步,使用
	@Scheduled(cron = "0 0 0 * * *")
    @SchedulerLock(name = "resetPrizeRemainCount", lockAtLeastFor = "60000", lockAtMostFor = "60000")
    public void resetPrizeRemainCount() {
    }

当定时任务开始执行的时候,我们去查看redis你会发现,分布式锁已经生效。过期时间就是上边我们设置的时间。
在这里插入图片描述

当然,从文档中我们看到它还支持自定义provider,锁扩展等等,如有需要可以自行研究。

下面说一下注解具体的参数说明和使用方法:
  • name
    锁的名称,是唯一的标识符。每个任务的锁名称应该唯一,因为它决定了这个锁在分布式环境中的唯一性。
  • lockAtMostFor
    锁的最大保持时间。即使任务执行完成或崩溃,锁也将在指定的时间后自动释放。通常用于确保锁不会因为异常情况而永远无法释放。
    ISO-8601持续时间格式或简单的时间单位格式。例如:PT30S(表示30秒)、PT10M(表示10分钟)或10m(表示10分钟)。
  • lockAtLeastFor
    锁的最小保持时间。在指定的时间内,即使任务执行完成,锁也不会释放。这有助于防止任务被频繁触发(如在短时间内的重复触发)。
  • lockAtLeastForString 和 lockAtMostForString
    这两个参数与 lockAtLeastFor 和 lockAtMostFor 类似,但它们允许通过 Spring 的属性占位符(例如:${lock.duration})来动态配置值。

http://www.kler.cn/a/283705.html

相关文章:

  • vue面试题7|[2024-11-14]
  • 「Mac玩转仓颉内测版12」PTA刷题篇3 - L1-003 个位数统计
  • 2023年MathorCup数学建模B题城市轨道交通列车时刻表优化问题解题全过程文档加程序
  • 【Java语言】String类
  • 2024年11月12日Github流行趋势
  • 【算法一周目】双指针(2)
  • CTFhub通关攻略-SSRF篇【1-5关】
  • windows安装Docker的步骤
  • 内联函数与动态内存分配
  • URP custompasscustom render objects
  • c++多线程交替输出
  • 启动盘如何复原
  • 【一文详解】内外网文件摆渡系统,解决网间数据安全传输问题
  • 【Python进阶(十二)】——自然语言处理
  • 《华为云 AI:开启智能未来的钥匙》
  • zsh 的补全系统
  • 数字芯片设计验证经验分享(第三部分):将ASIC IP核移植到FPGA上——如何确保性能与时序以完成充满挑战的任务!
  • 【FRP 内网穿透】
  • 【问题分析】SetupWizard退出动画卡住【Android15】
  • 【零知识证明】Groth16
  • GAMES202——作业3 Screen Space Ray Tracing
  • 创建型设计模式-构建器(builder)模式-python实现
  • 35. 交错动画 导航列表项的悬停和聚焦效果
  • Linux下UDP编程
  • InternVL 多模态模型部署微调实践
  • 物联网平台组件2: 平台校验规则