天天看點

Spring Boot實作定時任務的動态增删啟停

Spring Boot實作定時任務的動态增删啟停

作者 | jessehua

在spring boot項目中,可以通過​<code>​@enablescheduling​</code>​注解和@scheduled注解實作定時任務,也可以通過schedulingconfigurer接口來實作定時任務。但是這兩種方式不能動态添加、删除、啟動、停止任務。

要實作動态增删啟停定時任務功能,比較廣泛的做法是內建quartz架構。但是本人的開發原則是:在滿足項目需求的情況下,盡量少的依賴其它架構,避免項目過于臃腫和複雜。

檢視spring-context這個jar包中​<code>​org.springframework.scheduling.scheduledtaskregistrar​</code>​這個類的源代碼,發現可以通過改造這個類就能實作動态增删啟停定時任務功能。

Spring Boot實作定時任務的動态增删啟停

定時任務清單頁

Spring Boot實作定時任務的動态增删啟停

 定時任務執行日志

添加執行定時任務的線程池配置類

添加scheduledfuture的包裝類。scheduledfuture是scheduledexecutorservice定時任務線程池的執行結果。

添加runnable接口實作類,被定時任務線程池調用,用來執行指定bean裡面的方法。

添加定時任務注冊類,用來增加、删除定時任務。

添加定時任務示例類

定時任務資料庫表設計

Spring Boot實作定時任務的動态增删啟停

 定時任務資料庫表設計

添加定時任務實體類

新增定時任務

Spring Boot實作定時任務的動态增删啟停

修改定時任務,先移除原來的任務,再啟動新任務

删除定時任務

定時任務啟動/停止狀态切換

添加實作了commandlinerunner接口的sysjobrunner類,當spring boot項目啟動完成後,加載資料庫裡狀态為正常的定時任務。

工具類springcontextutils,用來從spring容器裡擷取bean

本文完,參考本文代碼可成功運作,親測!

往期推薦

​​你在 docker 中跑 mysql?恭喜你,可以下崗了!​​

​​0.2秒居然複制了100g檔案?​​

​​spring boot中使用postgresql資料庫​​

​​聊聊前後端分離的接口規範​​

​​校招黑名單!​​