springboot線程池任務調度類 -- ThreadPoolTaskScheduler介紹


  springboot中有一個bean,ThreadPoolTaskScheduler,可以很方便的對重復執行的任務進行調度管理;相比於通過java自帶的周期性任務線程池ScheduleThreadPoolExecutor,此bean對象支持根據cron表達式創建周期性任務

下面介紹一下此bean對象如何實現任務調度,以及如何支持基於cron表達式的任務。

一、如何實現任務調度?ThreadPoolTaskScheduler其實底層使用也是java自帶的線程池,源碼分析如下:

1. 有個成員變量:

 

2. 此成員變量的初始化:

3. 着重注意紅色框中的方法,代碼如下:

可以看出,其實也就是初始化了一個指定核心線程數的線程池,任務的調度就是通過此線程池成員變量實現。

二、如何提交基於cron表達式的任務,以及內部原理。

1. 提交任務接口如下:

其中第二個參數Trigger接口有一個實現CronTrigger,CronTrigger的構造函數中:

傳入一個cron表達式string,即可創建一個trigger。

 

2. 基於cron表達式的任務調度原理,回到上文提到的接口,源碼如下:

注意紅色框中的代碼,創建了一個ReschedulingRunnable實例,並調用其中的schedule方法,返回一個Future結果。一起看下ReschedulingRunnable這個類中的schdule方法

可以看出,首先根據cron表達式計算出下一個執行的delay,然后調用線程池的schedule方法,在指定延遲時間后執行當前這個對象的任務,到了執行時間后,

會調用實例本身的run方法,看下在run方法中執行了什么:

在方法第二句中,先執行任務,執行完成后,更新trigger上下文,然后再次調用schedule方法,那么在schedule方法中,又會再次計算下一次的執行時間點,提交下一次的執行任務,如此循環完成任務的調度。

上面的描述中只是說了大概的原理,其實還有些可以深究的地方,比如super.run()這句,如果方法中拋出了異常會不會導致整個任務的中斷,無法執行下一次的任務?源碼針對這個問題又是如何規避的呢?

有興趣的人可以根據源碼找到答案。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM