项目初期为了快速响应业务开发,对于部分业务需要使用到定时任务功能模块,会直接嵌入到主流程代码中间。当业务增加,发展成分布式服务时,那些定时任务对整体而言重复执行。如果避免分布式服务中的定时任务单一执行,又不需要重新迁移代码另外新开定时任务项目呢?

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配置锁的更多相关文章

  1. jdbc 配置

    jdbc 配置 Class.forName("com.mysql.jdbc.Driver")  ;//加载数据库驱动 Connection conn=null; String ur ...

  2. spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置

    spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置 jdbc.properties 文件信息如下: ---------- ...

  3. jdbc配置及使用测试

    源码:https://github.com/xiaostudy/jdbc_test1 这是没有使用连接池的 目录 创建的sql语句create.sql DROP TABLE IF EXISTS t_u ...

  4. Jmeter JDBC配置

    前提条件,驱动包mysql-connector-java-5.1.38-bin.jar要放到本机Java路径:C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext ...

  5. sql server 的JDBC 配置

    1.java中使用数据库需要用JDBC(java database connection)来连接和操作 下载地址:http://www.microsoft.com/en-us/download/det ...

  6. 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 保证上面软件已经安装,并且 ...

  7. Spring JDBC配置数据源

    在本系列教程中,使用的的是MySQL数据库,并创建一个数据库实例:test,在这个数据库实例:test中创建一个表student.如果您使用任何其他数据库,则可以相应地更改DDL和SQL查询,这问题不 ...

  8. Oracle JDBC配置

    Oracle数据库是收费的,Oracle的JDBC驱动在Maven仓库中虽有其名,却无法下载到jar包. 这就需要手动下载Oracle JDBC驱动并将其安装到本地Maven仓库中. 如果从官网下载, ...

  9. JDBC 配置环境

    一.配置JDBC环境:先下载驱动jar包 1.配置classpath环境变量  如(E:\jdbc\mysql-connector-java-5.1.7-bin.jar) 2.数据库URL: 2.1 ...

随机推荐

  1. mongodb 4.0配置认证模块

    use admin db.createUser({user:"root",pwd:"xxx",roles:[{role:"root",db: ...

  2. 从谷歌到脸书:为何巨头纷纷“钟情于”VR相机?

    VR的火爆,自然无需多言.而基于VR这一个概念,已经在多个相关行业不断衍生出新的产品.服务或内容.VR眼镜.VR头盔.VR相机.VR游戏.VR影视.VR应用--但VR产业的发展并不是齐头并进,而是出现 ...

  3. 使用BIND搭建内部DNS服务

    ​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌ ...

  4. C++扬帆远航——6(三色球)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanseqiu.cpp * 作者:常轩 * 完成日期:2016 ...

  5. 压力测试(七)-html可视化压测报告细讲

    1.阿里云Linux服务器 Jmeter压测实战之jtl文件生成和查看 简介: 利用软件从阿里云Centos服务器下载压测报告,讲解Jtl文件,并怎么查看文件 可以通过打开jmeter,新建线程组-& ...

  6. Linux centos7.0 配置防火墙及开放端口

    现在防火墙有两种服务1.service firewalld 2.service iptables 一.就firewalld来说查看开放的端口  netstat  -anp 查询防火墙状态  servi ...

  7. 【Django】接收照片,储存文件 前端代码

    后端: from rest_framework.views import APIView from car import settings from django.shortcuts import r ...

  8. c语言之学生管理系统

    0x00 学生管理系统 说到学生管理系统,对于每一个初学c语言的人都是一道不得不过的砍.不过,学习c,我觉得每个人都应该写一个学生管理系统,至于为什么,我想倘若连一个学生管理系统都写不好,哪么他的c是 ...

  9. A. Reorder the Array

    You are given an array of integers. Vasya can permute (change order) its integers. He wants to do it ...

  10. Python线性优化基础讲解~

    目前,各组织正在利用数据科学和机器学习来解决各种业务问题.为了创造一个真正的业务影响,如何弥合数据科学管道和业务决策管道之间的差距显得尤为重要. 数据科学管道的结果往往是数据中的预测.模式和洞察(通常 ...