场景模拟

定时器Scheduler在平时使用比较频繁,比如定时数据整理,定时向客户发送问候信息等...,定时任务的配置比较简单,比如在springboot中,配置好@Scheduled和@EnableScheduling之后,定时器就能正常执行,实现定时任务的功能。

但是在这样的情况下:如果开发的服务需要水平部署实现负载均衡,那么定时任务就会同时在多个服务实例上运行,那么一方面,可能由于定时任务的逻辑处理需要访问公共资源从而造成并发问题;另一方面,就算没有并发问题,那么一个同样的任务多个服务实例同时执行,也会造成资源的浪费。因此需要一种机制来保证多个服务实例之间的定时任务正常、合理地执行。

ShedLock介绍

ShedLock的出现就是为了解决上述问题,它可以保证多个一个定时任务在多个服务实例之间最多只执行一次,是一个在分布式环境中保证定时任务合理执行的框架。

ShedLock的实现原理是采用公共存储实现的锁机制,使得同一时间点只有第一个执行定时任务的服务实例能执行成功,并在公共存储中存储"我正在执行任务,从什么时候(预计)执行到什么时候",其他服务实例执行时如果发现任务正在执行,则直接跳过本次执行,从而保证同一时间一个任务只被执行一次。

上面提到的公共存储目前支持的有:

Monogo

DynamoDB

JdbcTemplate

ZooKeeper (using Curator)

Redis (using Spring RedisConnectionFactory)

Redis (using Jedis)

Hazelcast

值得注意的是,ShedLock不是一个分布式的定时任务框架,只是一个锁,用于保证分布式环境中的定时任务合理执行。贴一段原话:Please note that ShedLock is not and will never be full-fledged scheduler, it‘s just a lock. If you need a distributed scheduler, please use another project. ShedLock is designed to be used in situations where you have scheduled tasks that are not ready to be executed in parallel, but can be safely executed repeatedly. For example if the task is fetching records from a database, processing them and marking them as processed at the end without using any transaction. In such case ShedLock may be right for you.

依赖说明:

Java 8

slf4j-api

Spring Framework (optional)

ShedLock使用

以SpringBoot为例。

引入依赖:

net.javacrumbs.shedlock

shedlock-spring

2.3.0

定义一个定时任务:

@Component

public class DataHouseKeepingScheduler {

@Scheduled(cron = "*/5 * * * * ?")

private void dataHouseKeeping(){

System.out.println(String.format("[%s] DataHouseKeeping job run...", new Date()));

}

}

添加ShedLock

在主类或者@EnableScheduling的地方添加@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")

@SpringBootApplication

@EnableScheduling

@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

然后在@Scheduled(...)的地方添加@SchedulerLock(name = "scheduledTaskName")

@Component

public class DataHouseKeepingScheduler {

@Scheduled(cron = "*/5 * * * * ?")

@SchedulerLock(name = "dataHouseKeepingLock", lockAtLeastForString = "20000", lockAtMostForString = "30000")

private void dataHouseKeeping(){

System.out.println(String.format("[%s] DataHouseKeeping job run...", new Date()));

}

}

@SchedulerLock的作用是保证当前定时任务的方法执行时获得锁,忽略其他相同任务的执行。但是,name必须要指定,ShedLock就是根据这个name进行相同任务判定的(后面会细说)。注解中还有两个参数:

lockAtLeastForString: 锁持有的最小时间(ms)。比如示例代码中设定的5000ms表示当前方法执行时获取到的锁的最小时间是20s,20s之内,就算当前定时任务已经执行完成,其他任务也无法获得锁,必须等5s之后才能获取。

lockAtMostForString: 锁持有的最大时间(ms)。当前任务获取的锁的最大持有时间为30s,30s之后就算没有执行完,其他定时任务也可以获取锁去执行任务。

配置LockProvider,此处以jdbc为例。先引入依赖:

net.javacrumbs.shedlock

shedlock-provider-jdbc-template

2.3.0

配置@Bean:

@Component

public class ShedLockConfig {

@Resource

private DataSource dataSource;

@Bean

private LockProvider lockProvider(){

return new JdbcTemplateLockProvider(dataSource);

}

}

此处的DataSource即为当前应用的数据源。

注意,如果使用SqlServer需要设置schema,可以在JdbcTemplateLockProvider的构造方法中设置:

new JdbcTemplateLockProvider(dataSource, "schema.shedlock")

创建存储锁信息的表。

MySQL

CREATE TABLE shedlock(

name VARCHAR(64),

lock_until TIMESTAMP(3) NULL,

locked_at TIMESTAMP(3) NULL,

locked_by VARCHAR(255),

PRIMARY KEY (name)

)

SQLServer

CREATE TABLE [dbo].[shedlock](

[name] [varchar](64) NOT NULL,

[lock_until] [datetime] NULL,

[locked_at] [datetime] NULL,

[locked_by] [varchar](255) NOT NULL,

CONSTRAINT [PK_shedlock] PRIMARY KEY CLUSTERED

(

[name] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

Oracle

CREATE TABLE SHEDLOCK (

name VARCHAR2(64 CHAR),

lock_until TIMESTAMP,

locked_at TIMESTAMP,

locked_by VARCHAR2(255 CHAR),

PRIMARY KEY (name)

);

启动应用,定时任务开始执行:

[Mon Feb 25 22:38:15 CST 2019] DataHouseKeeping job run...

[Mon Feb 25 22:38:35 CST 2019] DataHouseKeeping job run...

[Mon Feb 25 22:38:55 CST 2019] DataHouseKeeping job run...

可以看到,虽然定时任务设定的是每5秒执行一次,但是控制台输出的却是每20秒一次,这时就是lockAtLeastForString="20000"生效了。

这时候来看看表里的数据:

总结

再次强调,ShedLock不是一个定时任务框架,而是一个保证定时任务在分布式环境中的合理执行的辅助框架,保证定时任务在分布式环境中同一时间最多只执行一次。同时一个任务在执行时,另一个任务无法获取锁时会跳过当前任务的执行。

最后关于ShedLock的版本说明(直接贴原话了):

Version 1.x.x is compiled and tested with Spring 5 and Spring Data 2. It should be safe to use ShedLock 1.x.x with Spring 4 if you are not using Spring Redis lock provider which introduced incompatibility. In other words

If you have dependency on spring-data-redis 2 - use ShedLock 1.x.x

If you have dependency on spring-data-redis 1 - use ShedLock 0.x.x

In all other cases, you can use both versions, prefereably 1.x.x

Demo源码地址

原文:https://www.cnblogs.com/nickhan/p/10434604.html

shedlock mysql_ShedLock日常使用相关推荐

  1. linux kvm虚拟化命令,Linux系统下kvm虚拟化(三)日常管理常用命令和配置说明

    根据我们之前创建和一些操作可以知道,KVM虚拟机的管理主要是通过virsh命令对环境下kvm虚拟机进行管理,下边这里整理一些常用的配置说明以及如何进行日常管理维护. 1,查看KVM虚拟机配置文件 KV ...

  2. 日常安排php,PHP日常开发小技巧

    PHP日常开发小技巧 导语:PHP语言中,如果你懂得一些开发技巧,那么对你学PHP,会有很大的帮助.下面的是百分网小编为大家整理的PHP日常开发小技巧,希望对你能有所帮助. PHP批量取得checkb ...

  3. linux作为办公机器,Ubuntu能否做日常办公使用?

    先说结论吧:不适合. (我现在就用Ubuntu18.04在写这篇文字) 先说说日常办公一般需要哪些软件吧. office软件:日常通讯比如QQ ,微信,钉钉等:中文输入法:网页浏览器:企业内部应用等. ...

  4. 数据库服务器 之 PostgreSQL数据库的日常维护工作

    来自:LinuxSir.Org 摘要:为了保持所安装的 PostgreSQL 服务器平稳运行, 我们必须做一些日常性的维护工作.我们在这里讨论的这些工作都是经常重复的事情, 可以很容易地使用标准的 U ...

  5. MySQL Cluster 日常维护

    在前面几篇文章已经详细介绍了MySQL Cluster的搭建,配置讲解.而且相信大家都掌握了基本用法.现在我们来看看Cluster的日常维护.熟悉日常维护,将有助于工作中更好的管理和使用Cluster ...

  6. 敏捷开发日常跟进系列之二:燃尽图(中)

    这是敏捷开发日常跟进系列的第二篇(栏目目录). 迭代及燃尽图的目标 燃尽图的目标是完成迭代的目标,迭代的目标是什么呢? 1. 按产品经理的要求,交付计划会中计划的用户故事 2. 尽量完成1 之后还会看 ...

  7. 这有一份 Git 日常使用清单,你需要吗?

    作者:echozh 链接:https://juejin.im/post/5d5b4c6951882569eb570958 前置条件: 在正式开始之前,我们需要先确定几个概念.下面所提到的 master ...

  8. 为什么,AX中存储的数据与我们日常理解相违背。

    因为它是小端存储. 又因为AX=AH+AL: 即最低地址存放的最低字节:(低地址放在AX中的AL中.这与我们日常理解的相背.) 一个用十六进制表示的32位数据:0x12345678,存放在存储字长是3 ...

  9. 服务器维护日常需做哪些工作?

    近年来网络数据安全越来越重要,服务器维护也越来越被重视,而在维护服务器的时候一定要谨慎小心,日常维护工作要处理好,否则出现一点小的错误就会影响很大.那么,服务器维护日常需做哪些工作呢? 近年来网络数据 ...

最新文章

  1. [国家集训队]最长双回文串 manacher
  2. 如何使用Quagga,将你的CentOS设备变成OSPF路由器
  3. Kinect for windows的脸部识别
  4. GDB调试:观察点(数据断点)【GDB调试】
  5. 【Hadoop Summit Tokyo 2016】LLAP:Hive上的次秒级分析查询
  6. CodeDay#6 成都站落幕,下一站北京见
  7. c/c++排坑(4) -- c/c++中返回局部变量
  8. android 33 对话框控件
  9. centos卸载不必要的程序_在RHEL / CentOS 7上禁用和删除不需要的服务最小安装
  10. #C++初学记录(算法测试2019/5/5)(深度搜索)
  11. linux程序员笔记软件,作为合格的程序员,你得知道这8款工具软件
  12. 使用python对目录下的文件进行分类
  13. 通过Matlab实现函数的简单的微分积分运算
  14. 三校生计算机教学计划,三校生高考英语教学计划.doc
  15. Ansible9:变量之Fact
  16. 基于Python构建机器学习Web应用
  17. 无人机快速三维建模平台
  18. react-ant design mobile - webpack 自定义主题
  19. 【VulnHub靶场】——BOREDHACKERBLOG: CLOUD AV
  20. 【深度优先搜索】弹珠游戏

热门文章

  1. 【Paper】2022_多无人机系统的分布式最优编队控制
  2. 8.1 概述-机器学习笔记-斯坦福吴恩达教授
  3. 【PC工具】创客、arduino爱好者必备,最最简单好用硬件电路连线绘图工具Fritzing...
  4. 【三维重建】基于切片的三维重建MATLAB仿真
  5. 通过 PSO实现TSP问题优化
  6. 十、延时之基本知识介绍及实验
  7. 最新阿里内推Java后端面试题
  8. shell特殊符号cut命令、sort_wc_uniq命令、tee_tr_split命令、shell特殊符号下
  9. 客户提的功能(需求),不能随口一说就当做,要分析其实质价值,多思考。
  10. CI框架 -- CLI执行php代码