Spring boot 集成分布式定时任务

news/2025/1/22 0:35:09/

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/news/1565085.html

相关文章

贪心算法(题1)区间选点

输出 2 #include <iostream> #include<algorithm>using namespace std;const int N 100010 ;int n; struct Range {int l,r;bool operator <(const Range &W)const{return r<W.r;} }range[N];int main() {scanf("%d",&n);for(int i0;i&l…

PL/SQL语言的文件操作

PL/SQL语言的文件操作 引言 PL/SQL&#xff08;Procedural Language/SQL&#xff09;是Oracle数据库提供的一种过程化编程语言&#xff0c;它结合了SQL的强大数据处理能力和过程性编程的灵活性。PL/SQL不仅可以用于数据库的操作和处理用户输入的数据&#xff0c;还可以进行丰…

数据结构——链表和单向链表

1、链表的介绍 &#xff08;1&#xff09;定义 链表是一种链式存储的线性表 链表是一种基本的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含一个值和指向下一个节点的指针 节点如下图所示&#xff1a; 与数组不同&#xff0c;链表中的节点不一定是连续的…

团体程序设计天梯赛-练习集——L1-012 计算指数

前言 这道题简单至极&#xff0c;几行代码就全都解决了。这次多来几个写法&#xff1b; L1-012 计算指数 真的没骗你&#xff0c;这道才是简单题 —— 对任意给定的不超过 10 的正整数 n&#xff0c;要求你输出 2 的n次方 。不难吧&#xff1f; 输入格式&#xff1a; 输入…

B站评论系统的多级存储架构

1. 背景 评论是 B站生态的重要组成部分&#xff0c;涵盖了 UP 主与用户的互动、平台内容的推荐与优化、社区文化建设以及用户情感满足。B站的评论区不仅是用户互动的核心场所&#xff0c;也是平台运营和用户粘性的关键因素之一&#xff0c;尤其是在与弹幕结合的情况下&#xf…

“AI智能防控识别系统:守护安全的“智慧卫士”

在如今这个科技飞速发展的时代&#xff0c;安全问题始终是大家关注的焦点。无论是企业园区、学校校园&#xff0c;还是居民社区&#xff0c;都希望能有一双“慧眼”时刻守护着&#xff0c;及时发现并防范各种安全隐患。而AI智能防控识别系统&#xff0c;就像一位不知疲倦、精准…

Python爬虫:从入门到实践

Python爬虫学习资料 Python爬虫学习资料 Python爬虫学习资料 在当今数字化信息爆炸的时代&#xff0c;数据已成为企业和个人发展的重要资产。Python爬虫作为一种高效获取网络数据的工具&#xff0c;正逐渐被广大开发者所熟知和应用。无论是市场调研、学术研究&#xff0c;还是…

Nginx+Tomcat实现动静分离

案例环境 实验步骤 配置Tomcat 下载java #查找所需java yum search java#下载openjdk yum -y install java-1.8.0-openjdk 关闭防火墙 systemctl stop firewalld && setenforce 0 下载Tomcat Tomcat官方下载地址https://archive.apache.org/dist/tomcat/ 解压…