天天看點

springboot的定時任務@schedule一、簡介二、解決方法三、分布式任務排程架構(TODO)3.1 引入原因

一、簡介

             項目中使用了springboot的@schedule注解來執行定時任務。不過該注解不做特殊設定時是存在隐患的。該注解内部預設的是采用的一個線程的線程池來串行執行任務的。

springboot的定時任務@schedule一、簡介二、解決方法三、分布式任務排程架構(TODO)3.1 引入原因

              這樣就會出現隐患,一是  定義了倆個任務,A任務淩晨3點執行, B任務淩晨4點執行, 此時如果A任務執行時間為一個半小時,則B任務會一直阻塞到點半才會開始執行,而非定義的4點執行,這就造成了B任務沒有定時執行的假象。還有一個隐患是 如果A任務執行過程中假死,則B任務和其它任務則會一直阻塞不執行,這就玩大發了。 

二、解決方法

             可以通過自定義定時執行任務的線程個數将串行改為并行即可,springboot可以通過添加如下配置類來解決:

@Configuration
@EnableAsync
public class AsyncConfig {

   /*
   此處成員變量應該使用@Value從配置中讀取
   */
   private int corePoolSize = 10;
   private int maxPoolSize = 200;
   private int queueCapacity = 10;

   @Bean
   public Executor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(corePoolSize);
    executor.setMaxPoolSize(maxPoolSize);
    executor.setQueueCapacity(queueCapacity);
    executor.initialize();
    return executor;
   }

}
           

三、分布式任務排程架構(TODO)

3.1 引入原因

         如果少量伺服器還好說,但是當大規模叢集的時候,僅僅使用@schedule注解就不行了,這樣無法看到任務是否執行完成,成功或失敗,任務數量,任務分布,鍊路追蹤等等等等。這時就需要引入分布式任務排程架構了。

3.2 分布式架構對比

3.2.1 對比圖

  •  對比圖  https://pan.baidu.com/s/1CZAjTFqIhinzlVLnrrMUKQ(注:該圖出自部落客路燈下的女孩)
springboot的定時任務@schedule一、簡介二、解決方法三、分布式任務排程架構(TODO)3.1 引入原因
springboot的定時任務@schedule一、簡介二、解決方法三、分布式任務排程架構(TODO)3.1 引入原因
springboot的定時任務@schedule一、簡介二、解決方法三、分布式任務排程架構(TODO)3.1 引入原因

3.3 Elastic-job

3.3.1 簡介

  • 當當出品,github位址: https://github.com/elasticjob/elastic-job-lite
  • 個人系列文章  Elastic-job系列(一)-------- 搭建Esjob控制台

3.4 XXL-job

3.4.1 簡介

  • 大衆點評出品,文檔豐富齊全,github位址: https://github.com/xuxueli/xxl-job

繼續閱讀