https://blog.csdn.net/qq_35992900/article/details/80429245html
咱們主要講解它的動態配置使用方法。 在剛開始使用的時候,咱們更改一個任務的執行時間,通常是這樣的:修改定時任務的執行週期,把服務停下來,改下任務的cron參數,再重啓服務就搞搞定了。這種方式很簡單,沒有可說的,可是有沒有一種可能,在不停服務的狀況下,就能夠動態的修改任務的cron參數呢?那是必須有! 剛剛提到的方法裏,咱們在主類上面加@EnableScheduling註解,在任務方法前面加上@Scheduled(cron =「0/5 * * * * *」)註解定義執行時間,可是動態配置的步驟就有點不同: 1. 在定時任務類上增長@EnabledScheduling註解,並實現SchedulingConfigurer接口。 2. 設置一個靜態的cron,用於存聽任務執行週期參數。 3. 從數據庫獲取Cron參數,用於模擬實際業務中外部緣由修改了任務執行週期。 4. 設置任務觸發器,觸發任務執行。 ————————————————
import java.util.Date; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Component @EnableScheduling public class TaskCronChange implements SchedulingConfigurer{ public static String cron; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { //項目部署時,會在這裏執行一次,從數據庫拿到cron表達式 cron = timerQueryMapper.getCronTime(); Runnable task = new Runnable() { @Override public void run() { //任務邏輯代碼部分. System.out.println("I am going:" + LocalDateTime.now()); } }; Trigger trigger = new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { //任務觸發,可修改任務的執行週期. //每一次任務觸發,都會執行這裏的方法一次,從新獲取下一次的執行時間 cron = timerQueryMapper.getCronTime(); CronTrigger trigger = new CronTrigger(cron); Date nextExec = trigger.nextExecutionTime(triggerContext); return nextExec; } }; taskRegistrar.addTriggerTask(task, trigger); } }
由於是要任務執行一次的時候纔會去修改時間的cron表達式,因此改了cron後,要在下下次任務執行時纔會生效。
這裏核心的主要是使用到了ScheduledTaskRegistrar這個類有一個方法addTriggerTask(Runnable,Trigger) 兩個參數,一個Runnable,一個是Trigger,在Runnable中執行業務邏輯代碼,在Trigger修改定時任務的執行週期。
java