Spring Cloud Alibaba -- 分布式定时任务解决方案(轻量级、快速构建)(ShedLock 、@SchedulerLock )

文章目录

  • 一、 ShedLock简介
  • 二、 @SchedulerLock
  • 三、基于Mysql方式使用步骤
    • 1.建表
    • 2.引入依赖
    • 3.Mysql连接配置
    • 4.ScheduledLock配置
    • 5.启动类配置
    • 6.创建定时任务
    • 7.启动多个项目服务进行测试
    • 8.SchedulerLock注解说明
  • 四、使用注意事项


一、 ShedLock简介

ShedLock 是一个用于 Java 和 Spring Boot 应用的开源分布式锁库,旨在确保在分布式环境下定时任务能够被安全地调度和执行。它的主要目的是防止在多节点环境中定时任务的重复执行,通过使用锁机制来实现这一目标。ShedLock 的设计哲学是轻量级和易于集成,特别适合那些不需要复杂调度逻辑的场景,但需要确保定时任务的执行不会发生竞态条件或资源冲突。

ShedLock 的特点
1、分布式锁:ShedLock 使用外部存储(如数据库或 Redis)来实现分布式锁,确保即使在多台服务器上运行相同的服务,同一时刻只有一个实例执行特定的定时任务。

2、轻量级:相对于像 Quartz 这样的全面调度框架,ShedLock 更专注于解决分布式定时任务的互斥执行问题,提供了简单的接口和较少的配置选项。

3、易用性:ShedLock 与 Spring Boot 的集成非常平滑,通过注解和自动配置简化了定时任务的管理,只需要使用@SchedulerLock即可。

4、Cron 和固定间隔支持:虽然 ShedLock 的调度功能相对简单,但它仍然支持 Cron 表达式和固定间隔的定时任务调度。

5、健壮性:ShedLock 能够处理任务失败的情况,提供重试机制,并且能够优雅地处理节点故障。


二、 @SchedulerLock

@SchedulerLock 注解是一个分布式锁的框架,结合@Scheduled 注解,可以保证任务同一时间,在多个节点上只会执行一次。该框架支持多种分布式锁的实现,比如Jdbc、Zookeeper、Redis等。
原理图如下:
在这里插入图片描述


三、基于Mysql方式使用步骤

1.建表

建表语句代码如下:

# 建表sql
CREATE TABLE shedlock(name VARCHAR(64) NOT NULL,lock_until TIMESTAMP(3) NOT NULL,locked_at TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),locked_by VARCHAR(255) NOT NULL,PRIMARY KEY (name)
);

2.引入依赖

<!--    shedlock的依赖    --><dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-spring</artifactId><version>4.23.0</version></dependency><dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-provider-jdbc-template</artifactId><version>4.23.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency>

3.Mysql连接配置

# 应用服务 WEB 访问端口
server.port=8080
spring.datasource.url=jdbc:mysql://192.168.10.26:19131/ch?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=sa123456
spring.datasource.driver-class=com.mysql.cj.jdbc.Driver

4.ScheduledLock配置

package com.example.schedulerlock.config;import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;
import java.util.TimeZone;/*** @Title: ScheduledLockConfig* @Author ch* @Date 2024/7/9 11:13* @description:*/
@Configuration
public class ScheduledLockConfig {@Autowiredprivate DataSource dataSource;@Beanpublic LockProvider lockProvider() {return new JdbcTemplateLockProvider(JdbcTemplateLockProvider.Configuration.builder().withJdbcTemplate(new JdbcTemplate(dataSource)).withTimeZone(TimeZone.getTimeZone("UTC")).build());}
}

5.启动类配置

package com.example.schedulerlock;import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "3m")
public class MySchedulerLockApplication {public static void main(String[] args) {SpringApplication.run(MySchedulerLockApplication.class, args);}}

6.创建定时任务

package com.example.schedulerlock.job;import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.joda.time.DateTime;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** @Title: SpringJob* @Author ch* @Date 2024/7/9 11:19* @description:*/
@Slf4j
@Component
public class SpringJob {/*** 每5分钟跑一次*/@Scheduled(cron = "0 */5 * * * ?")@SchedulerLock(name = "SpringJob.job1", lockAtMostFor = "2m", lockAtLeastFor = "1m")public void job1() {log.info("time=" + DateTime.now().toString("YYYY-MM-dd HH:mm:ss") + " do job1...");}/*** 每5秒跑一次*/@Scheduled(fixedRate = 5000)@SchedulerLock(name = "SpringJob.job2", lockAtMostFor = "4s", lockAtLeastFor = "4s")public void job2() {log.info("time=" + DateTime.now().toString("YYYY-MM-dd HH:mm:ss") + " do job2...");}/*** 上次跑完之后隔5秒再跑* @throws InterruptedException*/@Scheduled(fixedDelay = 5000)@SchedulerLock(name = "SpringJob.job3", lockAtMostFor = "4s", lockAtLeastFor = "4s")public void job3() throws InterruptedException {log.info("time=" + DateTime.now().toString("YYYY-MM-dd HH:mm:ss") + " do job3...");Thread.sleep(10000);}
}

7.启动多个项目服务进行测试

在这里插入图片描述

8.SchedulerLock注解说明

name:用来标注一个定时服务的名字,被用于写入数据库作为区分不同服务的标识,如果有多个同名定时任务则同一时间点只有一个执行成功。

lockAtMostFor: 这个属性指定了锁最多可以持有的时间长度。如果任务执行时间超过了给定时间,锁也将强制释放,以便其他等待的任务有机会获取锁并执行。但是,这也意味着如果任务执行时间超过锁的持有时间,可能会出现并发执行的情况。

lockAtLeastFor: 这个属性指定了锁至少可以持有的时间长度。这可以防止在任务执行结束后立即有另一个任务尝试获取相同的锁,从而产生不必要的锁争用。


四、使用注意事项

1、@SchedulerLock结合@Scheduled(cron = …):
利用 Cron 表达式来精确控制任务的执行时间点,同时利用 SchedulerLock 来保证任务执行的互斥性。Cron 表达式提供了更精细的时间控制,可以避免任务堆叠,而 SchedulerLock 则确保了即使在多个节点上部署,同一时刻也只有一个任务实例在运行。

2、@SchedulerLock结合@Scheduled(fixedRate = …)和(fixedDelay = …):
fixedRate 和fixedDelay 它们分别按照固定速率和固定延迟执行任务。这意味着无论上一次任务执行是否完成,到达设定的时间间隔后都会触发下一次执行。这种模式下,如果任务执行时间超过设定的间隔,可能会出现任务堆叠的情况,即多个任务实例同时运行。

SchedulerLock 的作用机制在于它会在任务开始执行前尝试获取一个锁,只有获取到锁的任务实例才能继续执行。执行完成后,锁会被释放,下一个任务实例才有机会获取锁并执行。这一机制非常适合保证任务的互斥执行,但在 fixedRate 或 fixedDelay 的场景下,由于任务的触发不依赖于前一个任务的完成,而是严格基于时间间隔,所以 SchedulerLock 只能保证每次任务开始执行时的互斥性,而无法直接控制任务的触发频率。

在分布式环境中使用 fixedRate 或 fixedDelay 时,如果不加额外控制,可能会导致多个节点上的任务实例几乎同时触发,从而违反了分布式定时任务的基本要求——确保同一时刻只有一个任务实例运行。此时,即使使用了 SchedulerLock,也可能因为多个节点几乎同时尝试获取锁而增加锁的争用,进而影响性能。

总之,SchedulerLock 与 fixedRate 或 fixedDelay 的结合使用需要谨慎,因为两者的设计目的和工作原理不同,可能不会达到预期的效果。在分布式定时任务的场景下,推荐使用 SchedulerLock 结合 Cron 表达式的方式,以获得更好的互斥性和时间控制。

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

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

相关文章

58、基于径向基神经网络的曲线拟合(matlab)

1、基于径向基神经网络的曲线拟合简介及原理 1&#xff09;原理简介 基于径向基神经网络&#xff08;Radial Basis Function Neural Network, RBFNN&#xff09;的曲线拟合是一种常用的非线性拟合方法&#xff0c;通过在输入空间中使用径向基函数对数据进行处理&#xff0c;实…

【机器学习】使用决策树分类器预测汽车安全性的研究与分析

文章目录 一、决策树算法简介决策树的结构分类和回归树 (CART)决策树算法术语决策树算法直觉 二、属性选择度量信息增益熵 基尼指数计算分割基尼指数的步骤 三、决策树算法中的过度拟合避免过度拟合的方法 四、导入库和数据可视化探索性数据分析重命名列名查看数据集的总结信息…

仪表板展示|DataEase看中国:2023年中国新能源汽车经济运行情况分析

背景介绍 随着政府机构、企业和个人对环保和可持续发展的高度关注&#xff0c;“新能源汽车”在全球范围内成为了一个热门话题。新能源汽车是指使用非传统燃料&#xff08;如电能、氢能等&#xff09;作为动力源的汽车。 在中国市场&#xff0c;新能源汽车产业蓬勃发展&#…

Python29 Tensorflow的基本知识和使用

1. TensorFlow TensorFlow 是一个开源的机器学习框架&#xff0c;由 Google Brain 团队开发。它用于数据流图的计算&#xff0c;尤其擅长深度学习任务。在 TensorFlow 中&#xff0c;数据流图&#xff08;Data Flow Graph&#xff09;是其核心概念之一&#xff0c;它定义了计算…

【QT】QComboBox允许输入查询,且不区分大小写

目录 0.简介 1.环境 2.详细代码 3.参考 0.简介 项目需求&#xff0c;原本有一个下拉框&#xff0c;但是条目太多&#xff0c;不好搜索&#xff0c;所以用户要求可以输入查找 修改前 &#xff1a; 修改后&#xff1a; 1.环境 windows11 vs-code qt5.12 2.详细代码 QComboB…

北斗防爆手持终端在化工厂的安全性能分析

北斗防爆手持终端在化工厂中的应用显著提升了安全性能&#xff0c;其卓越的防爆设计、高精度定位与监控功能、实时通信能力以及多功能集成特性&#xff0c;共同构筑了化工厂安全生产的坚实防线&#xff0c;确保了巡检人员与设备在复杂环境下的安全作业与高效管理。 北斗防爆手持…

触摸屏虚拟键盘组件 jQuery Virtual Keyboard使用 自定义键盘

如何在触摸设备上为输入域添加虚拟键盘&#xff1f; 一个插件可以解决这个问题&#xff0c;关键还支持高度自定义&#xff08;git地址&#xff09;&#xff1a; GitHub - Mottie/Keyboard: Virtual Keyboard using jQuery ~ 官网地址&#xff1a;Virtual Keyboard 使用步骤&…

免费下载工具 -- Free Download Manager(FDM) v6.24.0.5818

软件简介 Free Download Manager (FDM) 是一款免费的功能强大的下载管理软件&#xff0c;适用于多种操作系统&#xff0c;包括 Windows、macOS、Android 和 Linux。这款软件的特色在于它快速、安全且高效的下载能力。它可以下载各种热门网站的影片&#xff0c;支持 HTTP/HTTP…

人工智能算法工程师(中级)课程1-Opencv视觉处理之基本操作与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程1-Opencv视觉处理之基本操作与代码详解。OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它提供了各种视觉处理函数&am…

电脑虚拟摄像头怎么使用?电脑摄像头可以被虚拟摄像头替代吗?8款推荐!

在数字化日益普及的今天&#xff0c;视频通话和在线会议已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;当我们的电脑没有配备摄像头&#xff0c;或摄像头出现故障时&#xff0c;我们可能会面临一些不便。这时&#xff0c;电脑虚拟摄像头便成为了一个实用的解决方案…

摸鱼大数据——Spark SQL——Spark on Hive部署

1、集成原理 HiveServer2的主要作用: 接收SQL语句&#xff0c;进行语法检查&#xff1b;解析SQL语句&#xff1b;优化&#xff1b;将SQL转变成MapReduce程序&#xff0c;提交到Yarn集群上运行​SparkSQL与Hive集成&#xff0c;实际上是替换掉HiveServer2。是SparkSQL中的HiveSe…

《AIGC:智能创作时代》:AI创作革命来临,你准备好了吗?

想象一下&#xff0c;你正在欣赏一幅精美的画作&#xff0c;惊叹于其细腻的笔触和独特的构图。然而&#xff0c;当你得知这幅作品是由人工智能创作时&#xff0c;你会作何感想&#xff1f;这不再是科幻小说中的场景&#xff0c;而是我们正在经历的现实。 在这个AI技术飞速发展的…

AWS 云安全性:检测 SSH 暴力攻击

由于开源、低成本、可靠性和灵活性等优势&#xff0c;云基础设施主要由基于linux的机器主导&#xff0c;然而&#xff0c;它们也不能幸免于黑客的攻击&#xff0c;从而影响云的安全性。攻击Linux机器最流行的方法之一是通过SSH通道。 什么是 SSH 安全外壳协议&#xff08;Sec…

Elasticsearch基础(四):Elasticsearch语法与案例介绍

文章目录 Elasticsearch语法与案例介绍 一、Restful API 二、查询语法 1、ES分词器 2、ES查询 2.1、match 2.2、match_phrase 2.3、multi_match 2.4、term 2.5、terms 2.6、fuzzy 2.7、range 2.8、bool Elasticsearch语法与案例介绍 一、Restful API Elastics…

上海亚商投顾:沪指大涨超1% 两市成交额重回7000亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日放量反弹&#xff0c;午后集体涨超1%&#xff0c;深成指一度涨逾2%。消费电子板块全线爆发。 板…

基于vue的可视化大屏2

这个可视化大屏分为四个部分 一个引入代码&#xff0c;引入全局 index.vue. 左边代码centerleft.vue 右边代码centerright.vue 中间代码center.vue 主代码&#xff1a; 这是一段 Vue 框架的代码。 在 <template> 部分&#xff1a; 定义了一个根 div 元素。其中包含一…

免费插件集-illustrator插件-Ai插件-测量简单路径面积和周长

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;进行测量路径面积和周长处理。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/878…

【C++报错已解决】Invalid Use of ‘void’ Expression

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;调整函数返回类型方法二…

猎人维修大师免狗版

技术文档摘要 标题&#xff1a; 多功能维修工具集合概述 摘要&#xff1a; 本文档提供了一组多功能维修工具的概述&#xff0c;这些工具旨在为专业技术人员提供便利&#xff0c;以执行设备维修和软件解锁等任务。文档列出了各个工具的主要功能和应用场景。 关键词&#xff1…

机器人伦理分析:从扫地机器人到智能伙伴

我发过一个泡泡&#xff1a;机器人和扫地机器人。 意犹未尽&#xff0c;我觉得这是一个值得讨论下去的话题。或者是未来话题 在科技迅猛发展的今天&#xff0c;机器人已经从简单的执行工具演变为能够执行复杂任务的智能实体。特别是在家庭环境中&#xff0c;扫地机器人已经成为…