Spring Boot集成ShedLock分布式定时任务实例
ShedLock使用大全系列
- 前言
- 一、ShedLock是什么?
- 二、落地实现
- 1.1 引入依赖包
- 1.2 配置数据库连接信息
- 1.3 创建Mysql数据表
- 1.4 配置LockProvider
- 1.5 创建定时Job
- 1.6 主启动类
- 1.7 执行成功分析
- 1.7 修改表名
- 总结
前言
ShedLock确保您计划的任务最多同时执行一次。如果一个任务正在一个节点上执行,则它会获得一个锁,该锁将阻止从另一个节点(或线程)执行同一任务。请注意,如果一个任务已经在一个节点上执行,则在其他节点上的执行不会等待,只是将其跳过。
ShedLock使用外部存储(如Mongo,JDBC数据库,Redis,Hazelcast,ZooKeeper或其他存储库)进行协调。
注意:官网说明,它仅仅是一个分布式锁,并不是调度程序。
一、ShedLock是什么?
官方地址:https://github.com/lukas-krecan/ShedLock
以下是ShedLock锁提供者,通过外部存储实现锁,由下图可知外部存储集成的库还是很丰富的:
本篇教程我们基于JdbcTemplate存储为例来使用ShedLock锁。
二、落地实现
1.1 引入依赖包
shedlock所需依赖包:
<dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-spring</artifactId><version>4.23.0</version>
</dependency><!--每个外部存储实例所需依赖包不一样,这里是jdbc-->
<dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-provider-jdbc-template</artifactId><version>4.23.0</version>
</dependency>
JdbcTemplate依赖包:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
web工程依赖包:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.2 配置数据库连接信息
server:port: 9999
spring:datasource:url: jdbc:mysql://192.168.31.158:3306/testjdbc?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivertype: com.mysql.cj.jdbc.MysqlDataSource
1.3 创建Mysql数据表
# MySQL, MariaDB
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));# Postgres
CREATE TABLE shedlock(name VARCHAR(64) NOT NULL, lock_until TIMESTAMP NOT NULL,locked_at TIMESTAMP NOT NULL, locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (name));# Oracle
CREATE TABLE shedlock(name VARCHAR(64) NOT NULL, lock_until TIMESTAMP(3) NOT NULL,locked_at TIMESTAMP(3) NOT NULL, locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (name));# MS SQL
CREATE TABLE shedlock(name VARCHAR(64) NOT NULL, lock_until datetime2 NOT NULL,locked_at datetime2 NOT NULL, locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (name));# DB2
CREATE TABLE shedlock(name VARCHAR(64) NOT NULL PRIMARY KEY, lock_until TIMESTAMP NOT NULL,locked_at TIMESTAMP NOT NULL, locked_by VARCHAR(255) NOT NULL);
1.4 配置LockProvider
/*** @description: Shedlock集成Jdbc配置类* @author: DT* @date: 2021/5/22 0:07* @version: v1.0*/
// 标识该类为配置类
@Configuration
// //开启定时器
@EnableScheduling
// 开启定时任务锁,指定一个默认的锁的时间30秒
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class ShedlockJdbcConfig {/*** 配置锁的提供者*/@Beanpublic LockProvider lockProvider(DataSource dataSource) {return new JdbcTemplateLockProvider(JdbcTemplateLockProvider.Configuration.builder().withJdbcTemplate(new JdbcTemplate(dataSource)).usingDbTime().build());}
}
1.5 创建定时Job
/*** @description: 开启分布式锁定时任务* @author: DT* @date: 2021/5/22 0:23* @version: v1.0*/
@Component
@CommonsLog
public class TimeTaskJob {private static Integer count = 1;// @SchedulerLock的作用是保证当前定时任务的方法执行时获得锁,忽略其他相同任务的执行// name必须要指定,ShedLock就是根据这个name进行相同任务判定的// name:定时任务的名字,就是数据库中的主键(name)// lockAtMostFor:锁的最大时间单位为毫秒// lockAtLeastFor:锁的最小时间单位为毫秒/*** 任务1每5秒执行一次* lockAtLeastFor:虽然,定时任务是每隔5秒执行一次,但是,分布式锁定义的是:每次任务要锁住20秒,20秒是持有锁的最小时间,必须等20秒后才释放锁,并且确保在20秒钟内,该任务不会运行超过1次;* lockAtMostFor:锁最大持有时间30秒,表示最多锁定30秒钟,主要用于防止执行任务的节点挂掉(即使这个节点挂掉,在30秒钟后,锁也被释放),一般将其设置为明显大于任务的最大执行时长;如果任务运行时间超过该值(即任务30秒钟没有执行完),则该任务可能被重复执行。*/@Scheduled(cron = "0/5 * * * * ? ")@SchedulerLock(name = "testJob1",lockAtLeastFor = "20000", lockAtMostFor = "30000")public void scheduledTask1() {log.info(Thread.currentThread().getName() + "->>>任务1执行第:" + (count++) + "次");}/*** 任务2每5秒执行一次*/@Scheduled(cron = "0/5 * * * * ? ")@SchedulerLock(name = "testJob2")public void scheduledTask2() {log.info(Thread.currentThread().getName() + "->>>任务2执行第:" + (count++) + "次");}}
1.6 主启动类
@SpringBootApplication
public class JdbcApplication {public static void main(String[] args) {SpringApplication.run(JdbcApplication.class, args);}}
1.7 执行成功分析
可以看到两个任务交替执行,并且我们的count每次自加1都是有序的。但是这里说明一下ShedLock是单线程执行的。
1.7 修改表名
shedLock支持关系型数据库,以mysql为例,配置mysql以及表名;shedLock默认表名为shedlock,可以设置自定义表名。
总结
核心思想:通过对公用的数据库中的某个表进行记录和加锁,使得同一时间点只有第一个执行定时任务并成功在数据库表中写入相应记录的节点能够成功执行而其他节点直接跳过该任务。
Spring Boot集成ShedLock分布式定时任务实例相关推荐
- 使用Spring Boot + Quartz 实现分布式定时任务平台
本文将从项目实战出发来介绍分布式定时任务的实现.在某些应用场景下要求任务必须具备高可用性和可扩展性,单台服务器不能满足业务需求,这时就需要使用Quartz实现分布式定时任务. 一.分布式任务应用场景 ...
- Spring boot 集成 Elastic-job 实现定时任务
1. 介绍 当前主流的分布式任务调度: feature quartz elastic-job xxl-job antares opencron 依赖 mysql jdk1.7+, zookeeper ...
- spring boot集成Quartz实现定时任务
简介 Quartz是一款功能强大的任务调度器,Quartz有两个比较核心的组件:Job 和 Trigger. Quartz的三个基本要素 Scheduler:调度器,所有的调度都是由它来控制. Tri ...
- Spring Boot集成Hazelcast实现集群与分布式内存缓存
2019独角兽企业重金招聘Python工程师标准>>> Hazelcast是Hazelcast公司开源的一款分布式内存数据库产品,提供弹性可扩展.高性能的分布式内存计算.并通过提供诸 ...
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...
本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...
- Spring Boot Redis 实现分布式锁,真香!!
之前看很多人手写分布式锁,其实 Spring Boot 现在已经做的足够好了,开箱即用,支持主流的 Redis.Zookeeper 中间件,另外还支持 JDBC. 本篇栈长以 Redis 为例(这也是 ...
- Spring Boot Redis 实现分布式锁,真香
之前看很多人手写分布式锁,其实 Spring Boot 现在已经做的足够好了,开箱即用,支持主流的 Redis.Zookeeper 中间件,另外还支持 JDBC. 本篇栈长以 Redis 为例(这也是 ...
- Linux 安装Redis-6.2.5,配置及使用(RDB与AOF持久化、sentinel机制、主从复制、Spring Boot 集成 Redis)
CentOS 7 安装Redis-6.2.5版本 Redis采用的是基于内存的单进程 单线程模型 的KV数据库,由C语言编写.官方提供的数据是可以达到100000+的qps 应用场景: 令牌(Toke ...
- Spring Boot集成Quartz动态实现数据库任务
1. Quartz简介 1.1. 什么是Quartz Quartz是一个开源的任务调度框架.作用是基于定时.定期的策略来执行任务. 它是OpenSymphony开源组织在Job scheduling领 ...
最新文章
- EM算法(Expectation Maximization)期望最大化算法
- 最近的一次敏捷项目Scrum经验总结
- 使用SVD求取矩阵的伪逆
- Java面试题中高级,神策数据Java面试题
- Python:__slots__()方法和@property方法
- 【机器学习】那些决定模型上限的操作
- class path resource [log4j.properties] cannot be resolved to URL because it does not exist
- C++语言之父 Bjarne Stroustrup 简介
- 大数据挑战赛(大佬篇)
- Facebook授权登录
- 智伴机器人广西团队_畅想科技 智绘未来——2020年全区乡村学校少年宫科技体验日活动在广西科技馆举办...
- java进程因机器内存不足被系统kill的定位
- 那些前端应该知道的HTTP知识
- Django---简单from表单提交
- linux更改445端口,windows连接非445端口(nginx转发)的samba服务卡顿
- android手机自带浏览器无法识别apk文件
- 常用的正则表达式,复制粘贴,正则就这么简单
- TLS完美前向保密(perfect forward secrecy)翻译
- 125w短波通信距离_超短波通信距离浅析
- 北风课程 在线免费学
热门文章
- 信息学奥赛一本通 2043:【例5.11】杨辉三角形
- 信息学奥赛一本通 1122:计算鞍点 | OpenJudge NOI 1.8 05:计算鞍点
- 信息学奥赛一本通 1115:直方图 | OpenJudge NOI 1.9 09
- 信息学奥赛一本通(2054:【例3.4】适合晨练)
- 信息学奥赛一本通(1043:整数大小比较)
- Two Strings Swaps(CF-1006D)
- 点和正方形的关系(信息学奥赛一本通-T1056)
- linux内核模块是什么,Linux内核模块介绍,使用Linux模块的优点
- 网络教育统考计算机怎么考试,网络教育统考怎么考
- Protobuf介绍及简单使用(上)