作者 | jessehua
在spring boot項目中,可以通過<code>@enablescheduling</code>注解和@scheduled注解實作定時任務,也可以通過schedulingconfigurer接口來實作定時任務。但是這兩種方式不能動态添加、删除、啟動、停止任務。
要實作動态增删啟停定時任務功能,比較廣泛的做法是內建quartz架構。但是本人的開發原則是:在滿足項目需求的情況下,盡量少的依賴其它架構,避免項目過于臃腫和複雜。
檢視spring-context這個jar包中<code>org.springframework.scheduling.scheduledtaskregistrar</code>這個類的源代碼,發現可以通過改造這個類就能實作動态增删啟停定時任務功能。
定時任務清單頁
定時任務執行日志
添加執行定時任務的線程池配置類
添加scheduledfuture的包裝類。scheduledfuture是scheduledexecutorservice定時任務線程池的執行結果。
添加runnable接口實作類,被定時任務線程池調用,用來執行指定bean裡面的方法。
添加定時任務注冊類,用來增加、删除定時任務。
添加定時任務示例類
定時任務資料庫表設計
定時任務資料庫表設計
添加定時任務實體類
新增定時任務
修改定時任務,先移除原來的任務,再啟動新任務
删除定時任務
定時任務啟動/停止狀态切換
添加實作了commandlinerunner接口的sysjobrunner類,當spring boot項目啟動完成後,加載資料庫裡狀态為正常的定時任務。
工具類springcontextutils,用來從spring容器裡擷取bean
本文完,參考本文代碼可成功運作,親測!
往期推薦
你在 docker 中跑 mysql?恭喜你,可以下崗了!
0.2秒居然複制了100g檔案?
spring boot中使用postgresql資料庫
聊聊前後端分離的接口規範
校招黑名單!