數據庫鎖:分布式鎖——@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




















 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM