SpringBoot中實現(xiàn)@Scheduled動態(tài)定時任務(wù)
1. 概論
Spring Boot 中的 @Scheduled 注解為定時任務(wù)提供了一種很簡單的實現(xiàn),只需要在注解中加上一些屬性,例如 fixedRate、fixedDelay、cron(最常用)等等,并且在啟動類上面加上 @EnableScheduling 注解,就可以啟動一個定時任務(wù)了。
但是在某些情況下,并沒有這么簡單,例如項目部署上線之后,我們可能會修改定時任務(wù)的執(zhí)行時間,并且停止、重啟定時任務(wù)等,因為定時任務(wù)是直接寫死在程序中的,修改起來不是非常的方便。所以,簡單記錄一下自己的一些解決方案,僅供參考。
2. 在配置文件中設(shè)置參數(shù)
以 cron 表達式為例,一般的做法是將 @Scheduled 的屬性寫在程序中的,例如這樣:
@Component public class TestTask { private static SimpleDateFormat dateFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Scheduled(cron = "0/5 * * * * ?") public void test(){ System.out.println(dateFmt.format(new Date()) + " : 執(zhí)行定時任務(wù)"); } }
如果需要修改的話,我們可以將 cron 表達式配在 application.yml 中:
#application.yml中的配置 scheduled: cron: 0/5 * * * * ?
然后在 @Scheduled 中獲取這個配置:
@Scheduled(cron = "${scheduled.cron}") public void test(){ System.out.println(dateFmt.format(new Date()) + " : 執(zhí)行定時任務(wù)"); }
等到了線上的時候,再通過修改配置文件中的內(nèi)容來進行控制。具體怎么動態(tài)的修改配置文件中的內(nèi)容,后面我會專門寫一篇文章來說明。
3. 如何關(guān)閉定時任務(wù)
一種方式是根據(jù)實際的需求,設(shè)置一個很久之后的時間再執(zhí)行,例如明年的某個時間點,你可能會想何不設(shè)置一個已經(jīng)過去的時間(例如 2012 年),但是很遺憾,@Scheduled 并不支持設(shè)置年份。
另外 Spring Boot 2.1 以上的版本還提供了一種停止定時任務(wù)的方案,就是在 cron 中配置 “-” 即可,你也可以在配置文件中設(shè)置這個符號:
#application.yml中的配置 scheduled: cron: "-"
注意這里必須加上一個雙引號,因為在 application.yml 中, - 是一個特殊的字符。
4. 為定時任務(wù)設(shè)置開關(guān)
如果嫌上面這種方式比較死板,可以嘗試另一種,給定時任務(wù)加上開關(guān)的方案,在配置文件中配置一個 boolean 屬性,如果是 true 的話,就開啟定時任務(wù),否則不開啟。
#application.yml中的配置 scheduled: cron: 0/5 * * * * ? enable: scheduled: true
然后我們可以使前面說到的 @Conditional 注解來實現(xiàn)這個功能,如果你還不了解,可以看我這篇文章:淺談 Spring Boot 中的 @Conditional 注解
其實 @Scheduled 注解,是被一個叫做 ScheduledAnnotationBeanPostProcessor 的類所攔截的,所以我們可以根據(jù)配置,決定是否創(chuàng)建這個 bean,如果沒有這個 bean,@Scheduled 就不會被攔截,那么定時任務(wù)肯定不會執(zhí)行了,有了這個思路,實現(xiàn)起來就很簡單了。需要注意的是:這種方式,啟動類上面的 @EnableScheduling 需要去掉。
然后創(chuàng)建一個 ScheduledCondtion 類,內(nèi)容如下:
public class ScheduledCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { //讀取配置中的屬性 return Boolean.valueOf(context.getEnvironment().getProperty("enable.scheduled")); } }
這個類的功能很簡單,就是去讀取配置,然后返回一個 boolean 值。
然后創(chuàng)建一個配置類 ScheduledConfig ,內(nèi)容如下:
@Configuration public class ScheduledConfig { @Conditional(ScheduledCondition.class) @Bean public ScheduledAnnotationBeanPostProcessor processor() { return new ScheduledAnnotationBeanPostProcessor(); } }
這個配置,就是以 ScheduledCondtion 為條件,決定是否創(chuàng)建 bean。然后,啟動項目,定時任務(wù)就會執(zhí)行,如果我們將配置修改為 false,則不會執(zhí)行。
這樣的話,我們就能夠很容易的啟動或者關(guān)閉定時任務(wù)了,并且也可以實時修改 cron 表達式的值。
到此這篇關(guān)于SpringBoot中實現(xiàn)@Scheduled動態(tài)定時任務(wù)的文章就介紹到這了,更多相關(guān)SpringBoot @Scheduled動態(tài)定時內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud 系列之服務(wù)調(diào)用 OpenFeign的實現(xiàn)
這篇文章主要介紹了Spring Cloud 系列之服務(wù)調(diào)用 OpenFeign的實現(xiàn),需要的朋友可以參考下2020-11-11淺談Java?abstract關(guān)鍵字不能和哪些關(guān)鍵字共存
本文主要介紹了Java?abstract關(guān)鍵字不能和哪些關(guān)鍵字共存,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-10-10Intellij idea使用Statistic統(tǒng)計代碼行數(shù)的方法
這篇文章主要介紹了Intellij idea使用Statistic統(tǒng)計代碼行數(shù)的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04Java Validation Api實現(xiàn)原理解析
這篇文章主要介紹了Java Validation Api實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09java-RGB調(diào)色面板的實現(xiàn)(事件監(jiān)聽器之匿名內(nèi)部類)
這篇文章主要介紹了java-RGB調(diào)色面板的實現(xiàn)(事件監(jiān)聽器之匿名內(nèi)部類),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11Java EasyExcel實現(xiàn)導出多sheet并設(shè)置單元格樣式
EasyExcel是一個基于Java的、快速、簡潔、解決大文件內(nèi)存溢出的Excel處理工具,下面我們就來學習一下EasyExcel如何實現(xiàn)導出多sheet并設(shè)置單元格樣式吧2023-11-11