中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Cloud分布式定時器之ShedLock的實現方法

發布時間:2021-03-09 13:49:12 來源:億速云 閱讀:370 作者:小新 欄目:開發技術

這篇文章主要介紹了Spring Cloud分布式定時器之ShedLock的實現方法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

ShedLock

ShedLock是一個在分布式環境中使用的定時任務框架,用于解決在分布式環境中的多個實例的相同定時任務在同一時間點重復執行的問題。

解決思路是通過對公用的數據庫中的某個表進行記錄和加鎖,使得同一時間點只有第一個執行定時任務并成功在數據庫表中寫入相應記錄的節點能夠成功執行而其他節點直接跳過該任務。
目前已經實現的支持數據存儲類型不僅僅只有關系型數據庫,還包括MongoDB,Zookeeper,Redis,Hazelcast。

1. pom文件添加相關依賴

在pom文件中添加shedLock相關依賴

 <!--shedlock-->
    <dependency>
      <groupId>net.javacrumbs.shedlock</groupId>
      <artifactId>shedlock-spring</artifactId>
      <version>2.2.0</version>
    </dependency>
    <dependency>
      <groupId>net.javacrumbs.shedlock</groupId>
      <artifactId>shedlock-provider-jdbc-template</artifactId>
      <version>2.2.0</version>
    </dependency>

2. 添加相關配置

在啟動類添加@EnableScheduling和@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")注解,表示要啟動ShedLock定時任務

defaultLockAtMostFor要設置值,不設置會報錯;設置值一般設置比定時任務大點值,一般在每個定時任務中都會配置defaultLockAtMostFor值,會覆蓋啟動類中的值

@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class OneStopServiceApplication {
  public static void main(String[] args) {
    SpringApplication.run(OneStopServiceApplication.class, args);
  }

}

3.添加ShedLock配類

shedLock支持關系型數據庫,以mysql為例,配置mysql以及表名;shedLock默認表名為shedlock,可以設置自定義表名。

@Configuration
public class ScheduledLockConfig {
  @Bean
  public LockProvider lockProvider(DataSource dataSource) {
    //自定義表名
    return new JdbcTemplateLockProvider(dataSource,"ccsy_shedlock");
  }
}

4.ShedLock定時任務

@Component
public class HourTask {
  /**
   * 最小鎖定時間,一般設置成定時任務小一點
   */
  private static final int MIN_LOCK_TIME = 1000;//單位毫秒
  /**
   * 最大鎖定時間,一般設置成比正常執行時間長的值
   */
  private static final int MAX_LOCK_TIME = 1000 * 2;//單位毫秒

  
  @Scheduled(cron = "0/1 * * * * ? ")
  @SchedulerLock(name = "測試", lockAtMostFor = MAX_LOCK_TIME, lockAtLeastFor = MIN_LOCK_TIME)
  public void visitCountTaskByTwoHour() {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println("現在時間是" + format.format(new Date())+ Thread.currentThread().getName());
  }
}

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

  • name 用來標注一個定時服務的名字,被用于寫入數據庫作為區分不同服務的標識,如果有多個同名定時任務則同一時間點只有一個執行成功

  • lockAtMostFor 成功執行任務的節點所能擁有獨占鎖的最長時間,單位是毫秒ms

  • lockAtMostForString 成功執行任務的節點所能擁有的獨占鎖的最長時間的字符串表達,例如“PT14M”表示為14分鐘

  • lockAtLeastFor 成功執行任務的節點所能擁有獨占所的最短時間,單位是毫秒ms

  • lockAtLeastForString 成功執行任務的節點所能擁有的獨占鎖的最短時間的字符串表達,例如“PT14M”表示為14分鐘

5.創建mysql數據庫中定時任務ccsy_shedlock表

CREATE TABLE ccsy_shedlock (
 NAME VARCHAR ( 64 ),
 lock_until TIMESTAMP ( 3 ) NULL,
 locked_at TIMESTAMP ( 3 ) NULL,
locked_by VARCHAR ( 255 ),
PRIMARY KEY ( NAME ))

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Spring Cloud分布式定時器之ShedLock的實現方法”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泰州市| 清苑县| 延津县| 新河县| 武宁县| 江津市| 仙桃市| 宜昌市| 安达市| 赤峰市| 侯马市| 长葛市| 剑河县| 汾阳市| 随州市| 陆良县| 禄劝| 枣阳市| 武功县| 新沂市| 开平市| 麟游县| 富平县| 芒康县| 天镇县| 客服| 石景山区| 喀喇沁旗| 盘山县| 明光市| 庐江县| 洪泽县| 大城县| 乌鲁木齐县| 黄浦区| 漠河县| 八宿县| 阳高县| 珠海市| 乐亭县| 象州县|