Spring boot 集成分布式定时任务

server/2025/1/19 2:03:56/

Spring boot 集成分布式定时任务

定义及作用

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

集成

引入相关依赖

<!--shedlock--><dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-spring</artifactId><version>4.30.0</version></dependency>
     <dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-provider-redis-spring</artifactId><version>4.30.0</version></dependency>

编写配置类

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 {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Beanpublic 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的启动类或配置类上。

使用示例

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; //2hprivate 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个小时执行一次任务。

http://www.ppmy.cn/server/159510.html

相关文章

【数据结构】线性表-单链表

线性表-单链表 顺序表链表存储结构单链表初始化插入数据头插法尾插法在指定位置插入数据 遍历链表删除节点获取链表长度释放链表 顺序表 上一篇文章 链表介绍&#xff1a; 线性表链式存储结构的特点是&#xff1a;用一组任意的存储单元存储线性表的数据元素(这组存储单元可以…

如何在亚马逊云科技上大幅降低无服务器网页应用冷启动时间(上篇)

背景 我们在云端搭建无服务器&#xff08;serverless&#xff09;开发架构时&#xff0c;经常会被冷启动&#xff08;cold start&#xff09;带来的应用延迟所困扰。冷启动是指当无服务器资源在一段时间内未被调用&#xff0c;或需要扩展以处理新请求时&#xff0c;系统需要初…

Tabby - 开源的自托管 AI 编码助手

Tabby 是一个开源的自托管 AI 编码助手。使用 Tabby&#xff0c;每个团队都可以轻松设置自己的 LLM 驱动的代码完成服务器。独立式&#xff0c;无需 DBMS 或云服务。OpenAPI 接口&#xff0c;易于与现有基础设施&#xff08;例如 Cloud IDE&#xff09;集成。 支持消费级 GPU。…

vue编写一个可拖动的模块,并可以和任何其他组件组合使用

实现思路&#xff1a; 使用 Vue 的自定义指令&#xff08;directive&#xff09;来处理拖动逻辑。在 mounted 钩子中添加鼠标事件监听器&#xff0c;以实现拖动功能。在 unmounted 钩子中移除鼠标事件监听器&#xff0c;防止内存泄漏。 代码示例&#xff1a; <template&g…

前端小知识 鼠标穿透 pointer-events: none;

为什么会说到这个呢&#xff1f;是我觉得没有识别出来&#xff0c;然后就导致了这样的问题&#xff0c;这种情况不应该发生。我写了如下这样一段代码&#xff0c;但是发现当自己选择时间的时候无法选择。然后就发现变成了光标在闪烁。这样其实就是因为我选择到了这个input框的鼠…

STM32--定时器输出pwm知识点_stm32 pwm-CSDN博客

1. 选择TIM_OCMode_Toggle电平翻转模式&#xff0c; TIM_TimeBaseInitStruct.TIM_Period PWM_1_TIM_Period; 要设置成PWM_1_TIM_Period设置成0xffff - 1&#xff0c;设置成其他数值会出现脉冲一会有一会咩有。 资料&#xff1a;一文搞懂STM32定时器翻转模式&#xff08;产生…

SQL Server 导入Excel数据

1、选中指定要导入到哪个数据库&#xff0c;右键选择 》任务 》导入数据 2、数据源 选择Excel&#xff0c;点击 下一步(Next) 3、目前 选择OLE DB Provider &#xff0c;点击 下一步&#xff08;Next&#xff09; 4、默认 &#xff0c;点击 下一步&#xff08;Next&#xff09;…

JAVA-Exploit编写(3)--httpcomponents库使用文件上传

目录 1.依赖安装 2. upload文件代码 3.文件上传代码 1.依赖安装 文件上传处需要使用httpcomponents库,需要在Maven的pom.xml文件中导入依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId>&l…