使用shedlock实现分布式定时任务锁【防止task定时任务重复执行】

news2025/2/27 17:16:28

第一步:引入shedlock相关依赖

 <!--集成shedlock解决定时任务重复执行的问题-->
            <dependency>
                <groupId>net.javacrumbs.shedlock</groupId>
                <artifactId>shedlock-spring</artifactId>
                <version>2.2.1</version>
            </dependency>
            <dependency>
                <groupId>net.javacrumbs.shedlock</groupId>
                <artifactId>shedlock-provider-jdbc-template</artifactId>
                <version>2.2.1</version>
            </dependency>

ShedLock还可以使用Mongo,Redis,Hazelcast,ZooKeeper等外部存储进行协调,例如使用redis则引入下面的包

			<dependency>
                <groupId>net.javacrumbs.shedlock</groupId>
                <artifactId>shedlock-provider-redis-spring</artifactId>
                <version>${shedlock.redis.version}</version>
            </dependency>

第二步:创建数据库表结构,数据库表的脚本如下:

CREATE TABLE shedlock(
	NAME VARCHAR(64),
	lock_until TIMESTAMP(3) NULL,
	locked_at TIMESTAMP(3) NULL,
	locked_by VARCHAR(255),
	PRIMARY KEY (NAME)
)

第三步:添加shedlock配置类(定时任务防重复执行的配置类)

package com.sionma.dcxt.config;

import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
import net.javacrumbs.shedlock.spring.ScheduledLockConfiguration;
import net.javacrumbs.shedlock.spring.ScheduledLockConfigurationBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

import javax.sql.DataSource;
import java.time.Duration;

/**
 * FileName: ShedlockConfig
 * Author:   SixJR.
 * Date:     2023/6/23 21:26:24
 * Description: 定时任务防重复执行的配置类
 * History:
 * <author>          <time>          <version>          <desc>
 */
@Configuration
@EnableScheduling
public class ShedlockConfig {
    @Bean
    public LockProvider lockProvider(DataSource dataSource) {
        return new JdbcTemplateLockProvider(dataSource);
    }

    @Bean
    public ScheduledLockConfiguration scheduledLockConfiguration(LockProvider lockProvider) {
        return ScheduledLockConfigurationBuilder
                .withLockProvider(lockProvider)
                .withPoolSize(10)
                .withDefaultLockAtMostFor(Duration.ofMinutes(10))
                .build();
    }

}

第四步:在启动类上添加启动注解,否则SchedulerLock不会生效

@EnableSchedulerLock(defaultLockAtMostFor = "PT50S")

在这里插入图片描述
第五步:在执行定时任务的方法上面加上你要限制重复执行的注解@SchedulerLock

// 锁最多保持50秒,最少保持40秒
@SchedulerLock(name = "orderCancelTask", lockAtMostFor = 50 * 1000, lockAtLeastFor = 40 * 1000) 

以下是该注解的属性解释:
@SchedulerLock注解是Quartz Scheduler中的一个扩展注解,用于控制定时任务的并发执行。该注解具有以下属性:
name:设置任务的名称。该名称用于标识任务,在Quartz Scheduler中唯一。通常建议为任务命名一个具有描述性的名称。

lockAtMostFor:设置任务的最长锁定时间。这个值表示任务的最长允许运行时间。如果任务在此时间段内未能执行完成,Quartz Scheduler将会中断任务运行。属性值是以毫秒为单位的长整数。

lockAtLeastFor:设置任务的最短锁定时间。这个值表示任务被锁定的最短时间。即使任务的业务逻辑执行时间很短,也会保持锁定指定的时间。属性值是以毫秒为单位的长整数。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/678683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx网站服务二

目录 编译安装Nginx服务 2.安装依赖包 3.创建运行用户、组&#xff08;Nginx 服务程序默认以 nobody 身份运行&#xff0c;建议为其创建专门的用户账号&#xff0c;以便更准确地控制其访问权限&#xff09; 4.编译安装Nginx 5.检查、启动、重启、停止 nginx服务 6.添加 N…

前端Vue自定义tabbar底部tabbar凸起tabbar兼容苹果刘海屏小程序和APP

前端Vue自定义tabbar底部tabbar凸起tabbar兼容苹果刘海屏小程序和APP&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13167 效果图如下&#xff1a; # cc-myTabbar #### 使用方法 使用方法 <!-- tabBarShow&#…

Flutter Dart函数(方法)异常

目录 函数(方法) 可选命名参数 「required」 可选位置参数 默认参数值 匿名方法 函数是一等对象 异常 函数(方法) Dart 是一个真正的面向对象语言&#xff0c;方法也是对象并且具有一种 类型 Function。 这意味着&#xff0c;方法可以赋值给变量&#xff0c;也可以当做…

读发布!设计与部署稳定的分布式系统(第2版)笔记10_自动化和缓慢的响应

1. 工业机器人 1.1. 具有多层防护措施&#xff0c;防止对人员、机器和设施造成损害 1.2. 防护措施能限制机器人的动作和传感器的感知 1.3. 机械臂的旋转范围会远远小于它可以达到的全部运动范围 2. 自动化 2.1. 它更像是工业机器人 2.1.1. 掌握控制层感知系统的当前状态 …

chatgpt赋能python:Python的分割函数:split的介绍和使用方法

Python的分割函数&#xff1a;split的介绍和使用方法 在Python编程中&#xff0c;我们经常需要对字符串进行操作。其中&#xff0c;分割字符串是一项常见的任务。Python中的split()函数可以用于将字符串按照指定的分隔符进行拆分。本文将介绍split()函数的使用方法以及注意事项…

0019-TIPS-2019-tokyowesterns-gnote : switch(jump-table) Doubule Fetch

漏洞源码 #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/proc_fs.h> #include <linux/string.h> #include <linux/slab.h> #include <asm/uaccess.h>…

python:并发编程(二十)

前言 本文将和大家一起探讨python并发编程的实际项目&#xff1a;win图形界面应用&#xff08;篇二&#xff0c;共八篇&#xff09;&#xff0c;系列文章将会从零开始构建项目&#xff0c;并逐渐完善项目&#xff0c;最终将项目打造成适用于高并发场景的应用。 本文为python并…

C语言贪吃蛇课程设计实验报告(包含贪吃蛇项目源码)

文末有贪吃蛇代码全览,代码有十分细致的注释!!!文末有贪吃蛇代码全览,代码有十分细致的注释!!!文末有贪吃蛇代码全览,代码有十分细致的注释!!! 码文不易&#xff0c;给个免费的小星星和免费的赞吧&#xff0c;关注也行呀(⑅•͈ᴗ•͈).:*♡ 不要白嫖哇(⁍̥̥̥᷄д⁍̥̥…

Mac5款高效实用软件,值得推荐

目录 1.MarginNote 3&#xff1a;阅读批注学习笔记软件 2.iShot&#xff1a;Mac截图、长截图、带壳截图、贴图、标注、取色、录屏、录音、OCR、翻译&#xff0c;合集工具 3.KeyCastr-实时显示按下的按键 4.MindNode-超美观的思维导图 5.One Switch&#xff1a;系统设置一键…

CopyOnWriteArrayList源码

介绍 CopyOnWriteArrayList是Java并发包中提供的一个并发容器&#xff0c;它是个线程安全且读操作无锁的ArrayList&#xff0c;写操作则通过创建底层数组的新副本来实现&#xff0c;是一种读写分离的并发策略 在保证并发读取的前提下&#xff0c;确保了写入时的线程安全&…

百度 RT-DETR : 在实时目标检测上击败所有 YOLO !

论文地址&#xff1a;https://arxiv.org/abs/2304.08069 代码地址&#xff1a;https://github.com/PaddlePaddle/PaddleDetection 最近&#xff0c;基于端到端的 Transformer 检测器&#xff08;DETRs&#xff09;取得了显著的性能。然而&#xff0c;DETRs 的高计算成本问题尚…

chatgpt赋能python:Python的加减乘除使用指南

Python的加减乘除使用指南 Python是一种高级编程语言&#xff0c;其数学计算库和处理数值数据的能力使其成为科学计算&#xff0c;数据分析和机器学习领域的首选语言之一。在Python中&#xff0c;加减乘除是最基本和常用的四种数学计算操作。在本篇文章中&#xff0c;我们将介…

pyqt的学习(三)----鼠标点击和按键处理

QmyChartView 类的说明 QChart 和 QChartView 是基于 Graphics View 结构的绘图类。要对一个 QChart 图表进行鼠 标和按键操作&#xff0c;需要在 QChartView 类里对鼠标和按键事件进行处理&#xff0c;这就需要自定义一个 从 QChartView 继承的类。 QmyChartView 类是从 QC…

津津乐道设计模式 - 策略模式详解(以女友购物策略让你彻底明白)

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

Git工具【系统学习】

第一章 Git快速入门 1.1 Git概述 Git是一个免费的&#xff0c;开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型或大型的各种项目。Git易于学习&#xff0c;占用空间小&#xff0c;性能快得惊人。 1.2 SCM概述 SCM&#xff08;Software Configuration Managem…

Deepin Community Live CD New Kernel——自带6.3.8内核的镜像和apt源

镜像介绍 此镜像属于 Deepin Community Live CD 系列&#xff08;Deepin Community Live CD 简称为 DCLC&#xff0c;Deepin Community Live CD 是什么&#xff1f;传送门&#xff1a;https://bbs.deepin.org/post/242933&#xff09;&#xff0c;New Kernel 系列镜像旨在可以…

chatgpt赋能python:Python的下载流程

Python的下载流程 Python是一款流行的编程语言&#xff0c;其掌握程度在当今计算机科学领域越来越受到重视。在本文中&#xff0c;我们将探讨Python的下载流程&#xff0c;为初学者提供一些有用的信息。特别是&#xff0c;我们将着重介绍如何在Windows操作系统上下载Python。 …

Golang每日一练(leetDay0105) 超级丑数、右侧小于当前元素的个数

目录 313. 超级丑数 Super Ugly Number &#x1f31f;&#x1f31f; 315. 计算右侧小于当前元素的个数 Count-of-smaller-numbers-after-self &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练…

chatgpt赋能python:Python下载安装教程

Python下载安装教程 Python是一种高级编程语言&#xff0c;具有简单易学、强大多样的特点&#xff0c;不仅可以用来开发网站、应用程序、游戏&#xff0c;还可以用于数据科学、机器学习、人工智能等领域&#xff0c;被广泛应用于各行各业。 本文将为您提供详细的Python下载安…

MongoDB简介

目录 1、NoSQL概述 2、什么是MongoDB 3、MongoDB特点 一、MongoDB安装&#xff08;docker方式&#xff09; 二、MongoDB安装&#xff08;普通方式&#xff09; 三、MongoDB 概念解析 1、NoSQL概述 NoSQL(NoSQL Not Only SQL)&#xff0c;意即反SQL运动&#xff0c;指的是…