Spring boot 集成分布式定时任务

Spring boot 集成分布式定时任务

定义及作用

在分布式定时任务中,需要一种机制来确保同一任务在不同的服务实例中不会同时执行,这就是分布式定时任务锁的作用。

集成

引入相关依赖

xml 复制代码
<!--shedlock-->
       <dependency>
           <groupId>net.javacrumbs.shedlock</groupId>
           <artifactId>shedlock-spring</artifactId>
           <version>4.30.0</version>
       </dependency>
       
xml 复制代码
     <dependency>
                <groupId>net.javacrumbs.shedlock</groupId>
                <artifactId>shedlock-provider-redis-spring</artifactId>
                <version>4.30.0</version>
            </dependency>

编写配置类

java 复制代码
package com.my.note.shedlockUtil.config;

import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.redis.spring.RedisLockProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * Shedlock 配置
 *
 * @Author:wangguangxing
 * @Date:2025-01-15 15:49
 * @Description:
 */
@EnableScheduling
@Configuration
public class ShedlockConfig {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Bean
    public LockProvider getLockProvider() {
        return new RedisLockProvider(redisTemplate.getConnectionFactory());
    }

}

Spring 工作机制

Spring 容器在启动时,会扫描所有被 @Configuration 注解标记的类。对于这些配置类,它会检查其中被 @Bean 注解标记的方法。

当 Spring 容器发现 @Bean 注解时,会调用该方法来创建一个 Bean 实例,无论这个方法是否在代码的其他地方被显式调用。

getLockProvider 方法创建的 LockProvider 对象将作为分布式锁的提供者,在使用 @SchedulerLock 注解时会发挥作用。

关于 @Bean 注解的方法

在你提供的代码中,getLockProvider 方法被 @Bean 注解标记,它会被 Spring 容器处理。

Spring 容器会自动调用 getLockProvider 方法,并将其返回的 LockProvider 实例存储在容器中,作为一个 Spring Bean 进行管理。

复制代码
    getLockProvider 方法创建的 LockProvider 对象将作为分布式锁的提供者,在使用 @SchedulerLock 注解时会发挥作用。

@EnableScheduling注解

此注解是启用Spring定时任务的关键,需要添加到Spring boot的启动类或配置类上。

使用示例

java 复制代码
package com.my.note.shedlockUtil.controller;

import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RestController;

/**
 * Shedlock 控制器
 *
 * @Author:wangguangxing
 * @Date:2025-01-15 15:52
 * @Description:
 */
@RestController
public class ShedlockController {

    private static final long TIME_INTERVAL = 2 * 60 * 60 * 1000; //2h

    private static final String LOCK_TIME_MIN = "PT30M";
    private static final String LOCK_TIME_MAX = "PT1H";

    /**
     * 服务启动后,12000毫秒开始执行,执行频率为每两个小时
     */
    @Scheduled(initialDelay = 12000, fixedRate = TIME_INTERVAL)
    @SchedulerLock(name = "dailyTask", lockAtLeastFor = LOCK_TIME_MIN, lockAtMostFor = LOCK_TIME_MAX)
    public void dailyTask() {
        System.out.println("执行dailyTask定时任务");
    }

    /**
     * 服务启动后,12000毫秒开始执行,执行频率为每晚凌晨
     */
    @Scheduled(initialDelay = 12000,cron = "*/10 * * * * *")
    @SchedulerLock(name = "cycleTask", lockAtLeastFor = LOCK_TIME_MIN, lockAtMostFor = LOCK_TIME_MAX)
    public void cycleTask() {
        System.out.println("执行cycleTask定时任务");
    }
}
  • @Scheduled(initialDelay = 12000,cron = "0 0 0 * * *") 表示在容器启动12秒后首次执行任务,之后每天凌晨0点执行。
  • @SchedulerLock(name = "cycleTask", lockAtLeastFor = LOCK_TIME_MIN, lockAtMostFor = LOCK_TIME_MAX) 表示使用分布式锁,锁的名称为"cycleTask" 锁的最小持有时间为30分钟(PT30M),最大持有时间为1小时(PT1H)。
  • @Scheduled(initialDelay = 12000, fixedRate = TIME_INTERVAL) 可以固定频繁执行,比如每2个小时执行一次任务。
相关推荐
superman超哥6 分钟前
Rust 移动语义(Move Semantics)的工作原理:零成本所有权转移的深度解析
开发语言·后端·rust·工作原理·深度解析·rust移动语义·move semantics
_loehuang_15 分钟前
【mole】Mole User 开源用户中心:一站式身份认证与权限管理解决方案
spring boot·nacos·开源·用户中心·mole
superman超哥17 分钟前
Rust 所有权转移在函数调用中的表现:编译期保证的零成本抽象
开发语言·后端·rust·函数调用·零成本抽象·rust所有权转移
源代码•宸20 分钟前
goframe框架签到系统项目开发(实现总积分和积分明细接口、补签日期校验)
后端·golang·postman·web·dao·goframe·补签
无限进步_26 分钟前
【C语言】堆(Heap)的数据结构与实现:从构建到应用
c语言·数据结构·c++·后端·其他·算法·visual studio
初次攀爬者26 分钟前
基于知识库的知策智能体
后端·ai编程
喵叔哟26 分钟前
16.项目架构设计
后端·docker·容器·.net
强强强79527 分钟前
python代码实现es文章内容向量化并搜索
后端
A黑桃30 分钟前
Paimon 表定时 Compact 数据流程与逻辑详解
后端
掘金者阿豪32 分钟前
JVM由简入深学习提升分(生产项目内存飙升分析)
后端