ShedLock-jdbc配置锁
项目初期为了快速响应业务开发,对于部分业务需要使用到定时任务功能模块,会直接嵌入到主流程代码中间。当业务增加,发展成分布式服务时,那些定时任务对整体而言重复执行。如果避免分布式服务中的定时任务单一执行,又不需要重新迁移代码另外新开定时任务项目呢?
shedLock是个非常好的选择。简洁的配置,使用注解不干扰到业务即可实现。相对于其它实现方式而言是最简单的。
ShedLock可以保证多节点的计划任务同时只执行一次。使用加锁机制让其中一个节点运行计划任务,防止其它节点再次运行此计划任务,其它节点感知计划任务已加锁,不会进行等待状态,而是直接跳过。
ShedLock使用外部存储机制(如Mongo, JDBC database, Redis, Hazelcast, ZooKeeper)来协调。
ShedLock并不是分布式锁。它也不完全是分布式计划调度任务。

ShedLock只是提供一种切入机制,真正实现锁的机制由外部存储来提供。ShedLock还有个比较人性化的点,配置参数中必需要有锁的过期时间,防止死锁。
使用ShedLock步骤:
1、配置并激活Scheduled locking
2、注解到计划任务上
3、配置锁的提供者(JDBC、Redis、ZK)
演示如何使用JDBC来配置(非springBoot项目工程)。
添加依赖:
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>4.0.3</version>
</dependency>
@EnableSchedulerLock(defaultLockAtMostFor = "PT30m")
public class ScheduleManager { @Scheduled(cron = "1 1 */1 * * ?")
@SchedulerLock(name = "runSyncData",lockAtMostFor = "PT30m", lockAtLeastFor = "PT30s")
public void runSyncData(){
//......
}
}
PT为默认值,m/s表示时间单位
us:微秒
ns:纳秒
ms:毫秒
s :秒
m :分钟
h :小时
d :天
Examples:
"PT20.345S" -- parses as "20.345 seconds"
"PT15M" -- parses as "15 minutes" (where a minute is 60 seconds)
"PT10H" -- parses as "10 hours" (where an hour is 3600 seconds)
"P2D" -- parses as "2 days" (where a day is 24 hours or 86400 seconds)
"P2DT3H4M" -- parses as "2 days, 3 hours and 4 minutes"
"P-6H3M" -- parses as "-6 hours and +3 minutes"
"-P6H3M" -- parses as "-6 hours and -3 minutes"
"-P-6H+3M" -- parses as "+6 hours and -3 minutes"
lockAtMostFor:计划任务异常死亡后保留最长的时间,没有配置会使用默认defaultLockAtMostFor的值。如果计划任务正常运行完后就会释放锁。此属性时间尽量配置比正常运行时间长一些。
lockAtLeastFor:保留锁的最小时间量。主要目的是防止多节点执行非常短的任务和节点之间的时钟差异。
创建jdbc表
CREATE TABLE shed_lock(
name VARCHAR(64) NOT NULL COMMENT '锁名称',
lock_until TIMESTAMP(3) COMMENT '最大锁保留时间',
locked_at TIMESTAMP(3) COMMENT '使用锁时间',
locked_by VARCHAR(255) COMMENT '服务名称',
PRIMARY KEY (name)
)ENGINE=INNODB DEFAULT CHARSET=UTF8MB4 ;
配置提供者
<bean id="lockProvider" class="net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider">
<constructor-arg name="dataSource" ref="dataSource"/>
</bean>
dataSource是必传参数
如果不使用默认表名shed_lock,可以重置参数:<constructor-arg name="tableName" value="..."/>

---end---
ShedLock-jdbc配置锁的更多相关文章
- jdbc 配置
jdbc 配置 Class.forName("com.mysql.jdbc.Driver") ;//加载数据库驱动 Connection conn=null; String ur ...
- spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置
spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置 jdbc.properties 文件信息如下: ---------- ...
- jdbc配置及使用测试
源码:https://github.com/xiaostudy/jdbc_test1 这是没有使用连接池的 目录 创建的sql语句create.sql DROP TABLE IF EXISTS t_u ...
- Jmeter JDBC配置
前提条件,驱动包mysql-connector-java-5.1.38-bin.jar要放到本机Java路径:C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext ...
- sql server 的JDBC 配置
1.java中使用数据库需要用JDBC(java database connection)来连接和操作 下载地址:http://www.microsoft.com/en-us/download/det ...
- elasticsearch logstash jdbc 配置 增量更新
环境前提: centos 6.5 x64 jdk 1.8 elasticsearch 6.1.4 logstash 6.1.4 kibana 6.1.4 mysql 5.x 保证上面软件已经安装,并且 ...
- Spring JDBC配置数据源
在本系列教程中,使用的的是MySQL数据库,并创建一个数据库实例:test,在这个数据库实例:test中创建一个表student.如果您使用任何其他数据库,则可以相应地更改DDL和SQL查询,这问题不 ...
- Oracle JDBC配置
Oracle数据库是收费的,Oracle的JDBC驱动在Maven仓库中虽有其名,却无法下载到jar包. 这就需要手动下载Oracle JDBC驱动并将其安装到本地Maven仓库中. 如果从官网下载, ...
- JDBC 配置环境
一.配置JDBC环境:先下载驱动jar包 1.配置classpath环境变量 如(E:\jdbc\mysql-connector-java-5.1.7-bin.jar) 2.数据库URL: 2.1 ...
随机推荐
- 爬虫入门(四):urllib2
主要使用python自带的urllib2进行爬虫实验. 写在前面的蠢事:本来新建了一个urllib2.py便于好认识这是urllib2的实验,结果始终编译不通过,错误错误.不能用Python的关键字( ...
- c++背包问题
又鸽了好久…… 前言 博主刚刚学会背包问题不久,然后有一段时间没练习了 今天就来重新温习一下,顺手就写了这一篇博客. 好了,下面进入正题! 算法简介 背包问题是动态规划的一个分支 主要是分成了01背包 ...
- C++扬帆远航——12(抓小偷)
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:zhaoxiaotou.cpp * 作者:常轩 * 微信公众号: ...
- cssy元素居中的方法有哪些?
css的元素居中 各位小伙伴们在努力写网页的时候有没有遇到过这样的一个问题呢? 在写的时候发现他不居中,可是要分分钟逼死强迫症的啊! 别急,我来啦 哈哈哈 今天就带来三种css的元素居中的方法 第一种 ...
- 一篇文章带您读懂List集合(源码分析)
今天要分享的Java集合是List,主要是针对它的常见实现类ArrayList进行讲解 内容目录 什么是List核心方法源码剖析1.文档注释2.构造方法3.add()3.remove()如何提升Arr ...
- 生产要不要开启MySQL查询缓存
一.前言 在当今的各种系统中,缓存是对系统性能优化的重要手段.MySQL Query Cache(MySQL查询缓存)在MySQL Server中是默认打开的,但是网上各种资料以及有经验的DBA都建议 ...
- Yuchuan_Linux_C编程之九目录操作相关函数
一.整体大纲 二.相关函数 1. getcwd 函数作用:获取当前目录 头文件 #include <unistd.h> 函数原型 char *getcwd(char *buf, size_ ...
- Delphi XE XML信息的读取
<?xml version=""?> <ConString> <Item> <Name/> <Type>C</Ty ...
- JAVA校内赛
第一题: 问题描述 在计算机存储中,15.125GB是多少MB?答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分. ...
- 由世界坐标系转换到摄像机坐标系的lookAt()函数
在学习图形学和opengl的时候,都涉及到坐标转化,从物体坐标转换为世界的坐标,从世界的坐标转换为摄像机的坐标. 在世界坐标到摄像机转换的过程中常用lookAt函数得到转化矩阵.GLM官方文档对它的解 ...