一、傳統任務調度
基于Scheduled注解的任務調度 將cron表達式寫在任務執行的方法上,具體如下:
@Scheduled(cron = "30 59 * * * ?") 定義一個按時間執行的定時任務,在每小時59:30執行一次。
@Scheduled(fixedRate = 1000 * 60) 定義一個按一定頻率執行的定時任務,每隔1分鐘執行一次
@Scheduled(fixedRate = 1000 * 60,initialDelay = 1000) 定義一個按一定頻率執行的定時任務,每隔1分鐘執行一次,延遲1秒執行
執行原理:
https://blog.csdn.net/lwjdear/article/details/77991229
二、需求: 需要動態維護任務(維護頁面)
架構思路
執行頁面
操作頁面
實現思路:
1、初始化任務:數據庫維護一份任務列表,維護內容包括:任務bean、 任務methed、任務cron、任務模塊類型。每種服務器初始化時,只需將自己模塊的任務加入到任務隊列中即可,按計劃執行。
2、前后端交互: 用戶在頁面CRUD、開關任務等操作,在修改數據庫相關內容后,將操作內容發送到MQ中,各服務器訂閱自己服務模塊類型相關的MQ消息即可,這里的MQ分發消息的方式是廣播(即 所有服務器都可拿到任務修改的消息,并針對消息內容對任務隊列做出對應CRUD)。
3、任務開始執行:由于是在分布式環境下執行,而且需要保證一個任務只執行一次,為避免重復執行,這里加了zk競鎖的操作,并且不釋放(意味著只要在一臺服務器上執行了以后,那么后面的任務執行全部都在同一臺機器上,其他機器只能等待競鎖,可以保證在某執行任務的服務器掛掉以后,其他同模塊下的服務器可以立即頂上,繼續執行任務)