SpringBoot配置ShedLock分佈式定時任務

什麼是ShedLock

ShedLock是一個在分佈式環境中使用的定時任務框架,用於解決在分佈式環境中的多個實例的相同定時任務在同一時間點重復執行的問題,解決思路是通過對公用的數據庫中的某個表進行記錄和加鎖,使得同一時間點隻有第一個執行定時任務並成功在數據庫表中寫入相應記錄的節點能夠成功執行而其他節點直接跳過該任務。當然不隻是數據庫,目前已經實現的支持數據存儲類型除瞭經典的關系型數據庫,還包括MongoDB,Zookeeper,Redis,Hazelcast。

如何使用

ShedLock采用非侵入式編程的思想,通過註解的方式來實現相應的功能。

要使用ShedLock,請執行以下操作

  • 啟用並配置計劃鎖定
  • 註釋您的計劃任務
  • 配置鎖提供程序

1.啟用並配置計劃鎖定

首先,引入依賴

< dependency >
    < groupId > net.javacrumbs.shedlock </ groupId >
    < artifactId > shedlock-spring </ artifactId >
    < version > 2.5.0 </ version >
</ dependency >

現在我們需要將庫集成到Spring中。為瞭啟用計劃鎖定,請使用@EnableSchedulerLock註釋

@Configuration 
@EnableScheduling 
@EnableSchedulerLock(defaultLockAtMostFor  =  “ PT30S ”)
 類 MySpringConfiguration {
     ... 
}

註釋您的計劃任務

import  net.javacrumbs.shedlock.core.SchedulerLock ;
 
...
 
@Scheduled(...)@
 SchedulerLock(name  =  “ scheduledTaskName ”)
 public  void scheduledTask(){
    //做某事 
}

@SchedulerLock註解一共支持五個參數,分別是

name 用來標註一個定時服務的名字,被用於寫入數據庫作為區分不同服務的標識,如果有多個同名定時任務則同一時間點隻有一個執行成功
lockAtMostFor 成功執行任務的節點所能擁有獨占鎖的最長時間,單位是毫秒ms
lockAtMostForString 成功執行任務的節點所能擁有的獨占鎖的最長時間的字符串表達,例如“PT14M”表示為14分鐘
lockAtLeastFor 成功執行任務的節點所能擁有獨占所的最短時間,單位是毫秒ms
lockAtLeastForString 成功執行任務的節點所能擁有的獨占鎖的最短時間的字符串表達,例如“PT14M”表示為14分鐘

與Spring進行整合,ShedLock支持兩種Spring集成模式。

TaskScheduler代理

需要配置兩個Bean,一個是lockProvider,一個是scheduler

默認情況下,ShedLock在Spring周圍創建AOP代理TaskScheduler。如果未指定任務計劃程序,則會為您創建默認任務計劃程序。如果您有特殊需求,隻需創建一個bean實現TaskScheduler接口,它將自動包裝到AOP代理中。

由於ShedLock使用Mongo,JDBC數據庫,Redis,Hazelcast,ZooKeeper等外部存儲進行協調。所以我選擇的是redis。

<dependency>
    <groupId> net.javacrumbs.shedlock </ groupId >
    <artifactId > shedlock-provider-redis-spring </ artifactId >
    <version> 2.5.0 </version>
</dependency >
 
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
  </dependency>
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT5M")
public class ShedLockConfig {
 
 
    @Bean
    public LockProvider lockProvider(RedisTemplate redisTemplate){
        return new RedisLockProvider(redisTemplate.getConnectionFactory());
        
    }
    @Bean 
    public  TaskScheduler taskScheduler(){
     return  new  MySpecialTask​​Scheduler();
    }
    
}

預定方法代理

如果你有更多特殊需求,可以像這樣使用Scheduled Method代理

@EnableSchedulerLock(mode  =  PROXY_METHOD,defaultLockAtMostFor  =  “ PT30S ”)

如果PROXY_METHOD選擇瞭mode,則ShedLock會在每個帶@SchedulerLock註釋的方法周圍創建AOP代理。這種方法的主要優點是它不依賴於Spring調度。缺點是即使您直接調用該方法也會應用鎖定。還要註意,目前僅支持void返回方法,如果您註釋並調用具有非void返回類型的方法,則會引發異常。

到此這篇關於SpringBoot配置ShedLock分佈式定時任務的文章就介紹到這瞭,更多相關SpringBoot ShedLock分佈式定時任務內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: