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