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 ...
随机推荐
- mongodb 4.0配置认证模块
use admin db.createUser({user:"root",pwd:"xxx",roles:[{role:"root",db: ...
- 从谷歌到脸书:为何巨头纷纷“钟情于”VR相机?
VR的火爆,自然无需多言.而基于VR这一个概念,已经在多个相关行业不断衍生出新的产品.服务或内容.VR眼镜.VR头盔.VR相机.VR游戏.VR影视.VR应用--但VR产业的发展并不是齐头并进,而是出现 ...
- 使用BIND搭建内部DNS服务
...
- C++扬帆远航——6(三色球)
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanseqiu.cpp * 作者:常轩 * 完成日期:2016 ...
- 压力测试(七)-html可视化压测报告细讲
1.阿里云Linux服务器 Jmeter压测实战之jtl文件生成和查看 简介: 利用软件从阿里云Centos服务器下载压测报告,讲解Jtl文件,并怎么查看文件 可以通过打开jmeter,新建线程组-& ...
- Linux centos7.0 配置防火墙及开放端口
现在防火墙有两种服务1.service firewalld 2.service iptables 一.就firewalld来说查看开放的端口 netstat -anp 查询防火墙状态 servi ...
- 【Django】接收照片,储存文件 前端代码
后端: from rest_framework.views import APIView from car import settings from django.shortcuts import r ...
- c语言之学生管理系统
0x00 学生管理系统 说到学生管理系统,对于每一个初学c语言的人都是一道不得不过的砍.不过,学习c,我觉得每个人都应该写一个学生管理系统,至于为什么,我想倘若连一个学生管理系统都写不好,哪么他的c是 ...
- A. Reorder the Array
You are given an array of integers. Vasya can permute (change order) its integers. He wants to do it ...
- Python线性优化基础讲解~
目前,各组织正在利用数据科学和机器学习来解决各种业务问题.为了创造一个真正的业务影响,如何弥合数据科学管道和业务决策管道之间的差距显得尤为重要. 数据科学管道的结果往往是数据中的预测.模式和洞察(通常 ...