Springboot定時任務實現動態配置Cron參數(從外部數據庫獲取)

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

相關文章
相關標籤/搜索