【SpringBoot实战】分布式定时任务锁Shedlock

ShedLock(https://github.com/lukas-krecan/ShedLock) 是一个轻量级的分布式定时任务锁组件,使用其可以满足我们上面的技术需求,ShedLock 官方简单自我介绍:

“ShedLock makes sure that your scheduled tasks are executed at most once at the same time. If a task is being executed on one node, it acquires a lock which prevents execution of the same task from another node (or thread). Please note, that if one task is already being executed on one node, execution on other nodes does not wait, it is simply skipped.

Shedlock 从严格意义上来说不是一个分布式任务调度框架,而是一个分布式锁。所谓的分布式锁,解决的核心问题就是各个节点中无法通信的痛点。各个节点并不知道这个定时任务有没有被其他节点的定时器执行,所以理论上只需要有一个各个节点都能够访问到的资源,用这个资源去标记这个定时任务有没有执行就可以了。

Shedlock 实现分布式锁,可以依赖如下组件:

  • JdbcTemplate
  • Mongo
  • DynamoDB
  • DynamoDB 2
  • ZooKeeper (using Curator)
  • Redis (using Spring
  • RedisConnectionFactory)
  • Redis (using Jedis)
  • Hazelcast
  • Couchbase
  • ElasticSearch
  • CosmosDB
  • Cassandra
  • Multi-tenancy

本文主要以来 Redis 为公共存储,实现定时任务的分布式锁。首先,我们假设你的 Spring Boot 项目已经引入了 Redis,在项目的 pom 文件中加入依赖:

开启定时任务锁:

“defaultLockAtMostFor = “PT30S” 表示默认锁的最大占用时间是 30s;

其次,在定时任务方法上,加上注解 @SchedulerLock:

启动多个节点,会发现,每次定时任务只有一个节点执行,定时任务执行后,在 Redis 里会看到两个 key:job-lock:default:testTask-1 和 job-lock:default:testTask-2。

Shedlock 通过 AOP,拿到 TaskScheduler 的行为做代理,并加入分布式锁实现所需要的功能。

上锁入口在 RedisLockProvider.java:

可以看出上锁,其实就是 Redis 的 set 操作的过程。

任务执行的入口,可以参考 net.javacrumbs.shedlock.core.DefaultLockingTaskExecutor:

首先判断 lock 是否可用,然后再执行任务 task.call()。

作者:zhaoyh

来源链接:

http://zhaoyh.com.cn/2020/09/22/Spring%20Boot(%E5%85%AB)%E4%B9%8B%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E9%94%81Shedlock/#more

Original: https://www.cnblogs.com/suizhikuo/p/16264185.html
Author: 勤学如春起之苗
Title: 【SpringBoot实战】分布式定时任务锁Shedlock

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/539720/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Django数据库–事务及事务回滚

    数据库的读写操作中,事务在保证数据的安全性和一致性方面起着关键的作用,而回滚正是这里面的核心操作。Django的ORM在事务方面也提供了不少的API。有事务出错的整体回滚操作,也有…

    Java 2023年6月13日
    082
  • docker和docker compose安装使用、入门进阶案例

    一、前言 现在可谓是容器化的时代,云原生的袭来,导致 go的崛起,作为一名java开发,现在慌得一批。作为知识储备,小编也是一直学关于 docker的东西,还有一些持续继承 jen…

    Java 2023年6月15日
    073
  • Java开发笔记(一百三十七)JavaFX的标签

    前面介绍了JavaFX的窗口框架,其中舞台、场景、窗格都能与AWT/Swing体系的相关概念一一对应,不仅如此,JavaFX的常见控件也能在Swing中找到相应的控件。比如Java…

    Java 2023年6月6日
    085
  • Java 将Excel转为UOS

    以.uos为后缀的文件,表示Uniform Office Spreadsheet文件,是一种国产的办公文件格式,该格式以统一办公格式(UOF)创建,使用XML和压缩保存电子表格。既…

    Java 2023年6月7日
    086
  • idea内置tomcat中java代码热更新

    按照上图设置后,然后修改代码后按shift+F9快捷键,即可实现代码更新,这时在debug模式下会看到代码变更后的输出 Original: https://www.cnblogs….

    Java 2023年5月29日
    084
  • Kotlin中的协程和多线程比较实验

    这个博主比较有意思,都做了下实验,不过还是需要待验证 https://blog.csdn.net/android_cai_niao/article/details/11284921…

    Java 2023年5月30日
    074
  • Swagger框架

    开发软件:IDEA 项目类型:SpringBoot的JavaWeb 官网:https://swagger.io/ 在线文档:https://swagger.io/docs/spec…

    Java 2023年6月9日
    093
  • java如何快速创建List

    几个快速添加list的方法 1. 使用Collections.addAll()方法,前提还是需要手动 new ArrayList html;gutter:true; ArrayLi…

    Java 2023年5月29日
    076
  • MyBatis-Plus–@TableLogic注解

    开发过程中一般会遇到删除场景,但是为了保存数据实际运用时不会真的删除,MyBatis-Plus里可以将某个字段(例:delete_flag)标记为逻辑删除字段,方法是:在字段上加@…

    Java 2023年6月13日
    079
  • Java Iterator(迭代器)小笔记

    Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList和 HashSet 等集合。Iterator 是 Java 迭代器最简单…

    Java 2023年5月29日
    097
  • 前端(jQuery) 5

    一、初识jQuery jQuery 是一个 JavaScript 库。 jQuery 极大地简化了 JavaScript 编程。 jQuery 很容易学习。 二、jQuery 的功…

    Java 2023年6月5日
    083
  • Java面试题

    包含的模块 本文分为十九个模块,分别是:Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring B…

    Java 2023年5月29日
    068
  • 通过OptaPlanner优化 COVID-19 疫苗接种预约安排(2)

    持续规划 连续规划是一种同时管理一个或多个未来的计划周期,并可以每月、每周、每天、每小时甚至更频繁地重复该过程的技术。规划的时间窗口按指定的时间间隔往后移动。下图显示了每天更新的两…

    Java 2023年6月16日
    0108
  • 诶,我的动态数据源怎么失效了

    背景 模拟现场 原因 入口 找不同 什么时候放入到 conHolder的 结论 背景 项目中是有用到多数据源的,是用AbstractRoutingDataSource这个类来实现数…

    Java 2023年6月8日
    086
  • javaeye站点被ARP攻击有感

    javaeye站点被ARP攻击,这本身是一件令人遗憾的事情。但是看到其站长声明的内容,感觉他活该。 看到这个内容: 我对这个国家已经不报任何希望,但是你不要让我对中国的网管人员也不…

    Java 2023年5月29日
    069
  • SpringBoot项目Maven打包提示程序包不存在

    提示不存在的原因是 父工程中,创建生成的pom.xml中有着这样的build ,解决办法: 把这个build中的 或者改为这样的 重新打包解决 Original: https://…

    Java 2023年6月9日
    052
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球