• 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---

  • 相关阅读:
    图片延时加载LazyLoad真的是LazyLoad吗?
    IO流操作实现文件拷贝\简单加密及相关知识点
    浅谈WebService开发(一)
    一次网站被挂恶意代码的查错经历
    自测,我的优点与缺点
    共鸣,此话在中国的确有些道理
    VsAddIn "Region this"
    虹影图片下载器(Preview)
    Group != Team
    同感,不转不行 低调做人,高调做事
  • 原文地址:https://www.cnblogs.com/song27/p/12066702.html
Copyright © 2020-2023  润新知