首頁  >  文章  >  Java  >  SpringBoot怎麼動態修改Scheduled

SpringBoot怎麼動態修改Scheduled

WBOY
WBOY轉載
2023-05-15 20:58:151739瀏覽

SpringBoot 動態修改Scheduled

場景:

可設定的Scheduled 執行時間,正常的Scheduled 是在專案啟動的時候固定死的,沒辦法根據呼叫後台程式碼自動更新Scheduled執行時間

例如:

系統啟動讀取時間Cron : 0 0 3 * * ? ,透過執行後台方法可以動態配置Cron 時間格式,並且清楚掉原本執行任務,執行新的設定定時任務時間

1、根據ThreadPoolTask​​Scheduler 、ScheduledFuture 類別動態修改定時任務(ThreadPoolTask​​Scheduler 這個類別不能使用@Autowired ,直接定義成員變數)

private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private ScheduledFuture<?> future;

#2、動態修改Scheduled 後台方法邏輯(object 是Runnable 實作類別需要執行的定時邏輯,放到run 執行緒方法內)

threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.initialize();
if(future!=null){
    future.cancel(true);
}
future=threadPoolTaskScheduler.schedule(object,new CronTrigger("需要Cron时间格式字符串") );

以上邏輯------------------ ----- 就可以實現動態Scheduled 配置

以下邏輯----------------------- 配置項目啟動自動讀取DB Cron 設定定時

1、@Order 並實作CommandLineRunner 類別重寫方法run

@Override
    public void run(String... args) throws Exception {
        logger.info("系统启动 默认设置对账任务 时间");
        //获取目前DB 设置的对账时间
        GetBillTimeResp time = systemConfigService.getTime();
        //获取Cron时间格式字符串
        String timeCron = billTimeCronFormat(time.getBillTime());
        logger.info("时间为:"+timeCron);
        //Scheduler 设置每天执行。。。
        threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.initialize();
        future=threadPoolTaskScheduler.schedule(object,new CronTrigger("DB Cron时间格式字符串")); }

SpringBoot專案@Scheduled讀取動態參數

# 1.基於@Scheduled可設定開發

application.propertites: 
read.timer.parmas=0 0/1 * * * *

定時類別:

@Component
public class ScheduledService {
Logger logger= LoggerFactory.getLogger(ScheduledService.class);
    @Scheduled(cron = "${read.timer.parmas}")
    public void readConfigTable(){
        logger.info("*****.read.timer.parmas");
    }
}

啟動類別:

@SpringBootApplication
@EnableScheduling  //必须
public class DataApplication {
  public static void main(String[] args) {
        SpringApplication.run(DataApplication.class,args);
    }
}

2、基於程式碼實作

(1)核心代碼

@Component
@EnableScheduling
public class TestScheduledParams implements SchedulingConfigurer{
    Logger logger= LoggerFactory.getLogger(TestScheduledParams.class);
 
    public static  String DEFAULT_CORN="0/3 * * * * *";
    //##动态传参要给默认值。
    public static String corn=DEFAULT_CORN;
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {     
        taskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
               // logger.info("定时任务逻辑");
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                //任务触发,可修改任务的执行周期
                CronTrigger cronTrigger = new CronTrigger(corn);
                Date date = cronTrigger.nextExecutionTime(triggerContext);
                return date;
            }
        });
    }
}

(2)其他類別或方法動態傳參賦值

TestScheduledParams.corn="0/20 * * * * *"

以上是SpringBoot怎麼動態修改Scheduled的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除