• 数据库锁:分布式锁——@SchedulerLock


    SpringBoot之数据库锁-@SchedulerLock

           分布式锁ShedLock确保计划的任务最多同时执行一次。如果一个任务正在一个节点上执行,它会获得一个锁,该锁将阻止从另一个节点(或线程)执行同一任务。请注意,如果一个任务已经在一个节点上执行,则在其他节点上的执行不会等待,只会跳过它。就是当第一个微服务执行定时任务的时候,会定时任务进行锁操作,然后其他的定时任务就不会再执行,锁操作有一定的时长,超过这个时长以后,再一次,所有的定时任务进行争抢下一个定时任务的执行权限,如此循环。保证了即使是其中的一个定时任务挂掉了,到一定的时间以后,锁也会释放,其他的定时任务依旧会进行执行权的争夺,执行定时任务。

    使用方式(Springboot)

       1.gradle方式引入依赖

       compile('net.javacrumbs.shedlock:shedlock-provider-jdbc-template:2.1.0')
       compile('net.javacrumbs.shedlock:shedlock-spring:2.2.0')
    Maven方式
       <dependency>
           <groupId>net.javacrumbs.shedlock</groupId>
           <artifactId>shedlock-spring</artifactId>
           <version>2.1.0</version>
       </dependency>
       <dependency>
           <groupId>net.javacrumbs.shedlock</groupId>
           <artifactId>shedlock-provider-jdbc-template</artifactId>
           <version>2.2.0</version>
       </dependency>

    2.启用SchedulerLock
        @Scheduled(cron = "0 0/5 * * * *") //五分钟执行一次
        @SchedulerLock(name = "ClusterDataDs", lockAtLeastFor = HsConstants.LOCKEDLEASTTIME, lockAtMostFor = HsConstants.LOCKEDMOSTTIME)
        public void ClusterDataDs(){
        }
    //在所需要方法的上面加@SchedulerLock注解

      3.在数据库里加上创建提供锁的外部存储表(shedlock)

    CREATE TABLE shedlock(
        name VARCHAR(64) , 
        lock_until TIMESTAMP(3) NULL, 
        locked_at TIMESTAMP(3) NULL, 
        locked_by  VARCHAR(255), 
        PRIMARY KEY (name)
    ) 
    属性说明
    name 锁名称 ,name必须是主键
    lock_until 释放锁时间
    locked_at 获取锁时间
    locked_by 锁提供者

    //@SchedulerLock声明的锁名称自动创建对应的键值对,提供锁。@SchedulerLock(name = "ClusterDataDs")name值对应的是库里的name的赋值。



      

    SchedulerLock 参数

    • @SchedulerLock
      将所需要加锁的方法加上此锁,还必须指定锁的名称。同时在一个时间内只能执行一个任务。
    • name
      分布式锁名称,锁名称必须是唯一的。
    • lockAtMostFor & lockAtMostForString
      指定在执行节点死亡时应将锁保留多长时间。这只是一个备用选项,在正常情况下,任务完成后立即释放锁定。 使用时必须将其设置lockAtMostFor为比正常执行时间长得多的值。如果任务花费的时间超过 lockAtMostFor了所导致的行为,则可能无法预测(更多的进程将有效地持有该锁)。
      lockAtMostFor 单位 毫秒
      lockAtMostForString 使用“ PT14M” 意味着它将被锁定不超过14分钟。
    • lockAtLeastFor & lockAtLeastForString
      该属性指应保留锁定的最短时间。其主要目的是在任务很短且节点之间的时钟差的情况下,防止从多个节点执行。

    例:假设有一个任务,每10分钟执行一次,通常需要花费几分钟才能运行。此外,您希望每15分钟最多执行一次。在这种情况下,可以像这样配置

    @Scheduled(fixedDelay = 1000*60*10)
        @SchedulerLock(name = "queryRechargeBill", lockAtMostFor = 1000*60*15, lockAtLeastFor = 1000*60*5)
        public void queryRechargeBill(){
        // do something
    }
    该锁将持有5分钟,5分钟释放,当节点异常或者死亡,该锁默认在15分钟后自动释放。在正常情况下,ShedLock在任务完成后立即释放锁定。实际上,我们不必这样做,因为@EnableSchedulerLock中提供了默认值, 但我们选择在此处覆盖它。
     
    ------------------------------------------------------
    还待更新


     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    转载链接:https://www.jianshu.com/p/94a0378798e1




















     
  • 相关阅读:
    Eclipse IDE及环境设置
    Spring3.X 配置Spring MVC 配置
    常用排序算法总结
    内存数据库
    mysql提高查询速度
    Linux下nginx编译安装教程和编译参数详解
    Mysql初始化root密码和允许远程访问
    GIS1
    ArcGIS Server分布式安装(转)
    COM
  • 原文地址:https://www.cnblogs.com/lingjies/p/13206887.html
Copyright © 2020-2023  润新知