1 概述

定時任務,特定的時間執行任務,在項目中普遍使用。本文介紹簡單的無狀態無持久化的定時任務實現方式;Timer,ScheduledExecutorService,Spring Task。

2 Timer實現方式

JDK自帶的java.util.Timer;通過調度java.util.TimerTask的方式 讓程序按照某一個頻度執行,但不能在指定時間運行。一般用的較少。

3 ScheduledExecutorService實現方式

ScheduledExecutorService,JDK1.5新增的,位於java.util.concurrent包中;是基於線程池設計的定時任務類,每個調度任務都會被分配到線程池中,併發執行,互不影響。

與Timer很類似,但它的效果更好;多線程並行處理定時任務時,Timer運行多個TimeTask時,只要其中有一個因任務報錯沒有捕獲拋出的異常,其它任務便會自動終止運行,使用 ScheduledExecutorService則可以規避這個問題。

4 Spring Task`實現方式(推薦)

Spring Task, Spring3.0 以後新增了task,一個輕量級的Quartz,功能夠用,用法簡單。

Spring Task在spring-context的org.springframework.scheduling下,只需要依賴spring-boot-starter-web即可。

@Scheduled註解, Spring Task定時任務的核心

cron:cron表達式,根據表達式循環執行,與fixedRate屬性不同的是它是將時間進行了切割。@Scheduled(cron = "0/5 * * * * *"任務將在5、10、15、20…這種情況下執行。fixedRate: 每隔多久執行一次;@Scheduled(fixedRate = 1000假設第一次工作時間爲2018-09-28 10:58:28,工作時長爲3秒,那麼下次任務的時候就是2018-09-28 10:58:31;配置成異步後,只要到了執行時間就會開闢新的線程工作,如果@Scheduled(fixedRate = 1000假設第一次工作時間爲2018-09-28 10:58:28,工作時長爲3秒,那麼下次任務的時間是2018-09-28 10:58:29。fixedDelay: 當前任務執行完畢後等待多久繼續下次任務@Scheduled(fixedDelay = 3000假設第一次任務工作時間爲2018-09-28 10:58:30,工作時長爲5秒,那麼下次任務的時間就是2018-09-28 10:58:38。initialDelay: 第一次執行延遲時間,只是做延遲的設定,與fixedDelay關係密切,配合使用,相輔相成。

@Async註解,代表該任務可以進行異步工作,由串行改爲並行。

cron表達式在線生成: http://www.pdtools.net/tools/becron.jsp

開啓任務

@EnableScheduling註解表示開啓對@Scheduled註解的解析;同時new ThreadPoolTaskScheduler()也是相當的關鍵,通過閱讀過源碼可以發現默認情況下的 private volatile int poolSize = 1;這就導致了多個任務的情況下容易出現競爭情況,多個任務的情況下,如果第一個任務沒執行完畢,後續的任務將會進入等待狀態。@EnableAsync註解表示開啓@Async註解的解析;作用就是將串行化的任務給並行化。

5 測試結果

請自己動動手

6 工程目錄

7 結束語

後續文章會陸續介紹,Quartz,以及基於Quartz實現的分佈式任務項目,xxl-job,elastic-job,盡情期待,附本文源碼鏈接:https://github.com/Mkeeper6/SpringBoot-About

查看原文 >>
相關文章