SpringBoot:定時任務
定時任務@Scheduler
Spring支持使用註解@Scheduler標記定時任務。
@Scheduler可以傳入六個參數,分爲下面四種:
- fixedDelay: 每次方法執行完畢後,等待Nms再執行此方法。(fixedDelayString與他一樣,只是參數是字符串,重點支持佔位符,如${})
eg:@Scheduled(fixedDelay=1000)- fixedRate: 每隔5s調用一次此方法,無論之前的方法是否執行完畢.(fixedRateString這個與他一樣,參數爲String,重點支持佔位符,如${})
eg: @Scheduled(fixedRate=5000)- initialDelay: 第一次調用此方法前的等待時間
eg:@Scheduled(initialDelay=1000, fixedRate=5000),同樣,存在(initialDelayString,支持佔位符)- 最後是cron表達式,支持佔位符,參數爲String
eg: @Scheduled(cron=" */5 * * * * ? ")//五秒一次裏面參數分別代表:second, minute, hour, day of month, month, day of week
用的較多的主要是corn表達式,如果不會,隨便百度cron表達式驗證,就有那種在線網站可以UI到表達式雙向解析。當然也可以學習一下他的寫法,這裏就不細講了。
線程池配置
可以使用默認的線程池,當然這裏要說一下自定義線程池
TaskScheduler是spring的定時任務使用的線程池的關鍵類。其類繼承關係可以看一下我上一篇文章。https://blog.csdn.net/weixin_39789689/article/details/98469341
/**
* 通過實現SchedulingConfigurer對定時任務線程池進行更細緻配置
* @author hby
*
*/
@Component
@Configuration
public class MySchedulingConfigurer implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskScheduler.setPoolSize(10);//參數可以配到配置文件
taskScheduler.initialize();
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
//不想重寫就直接用默認的也不是不行;
//return Executors.newScheduledThreadPool(100);
return new ScheduledThreadPoolExecutor(10, new ThreadFactory() {
private AtomicInteger max = new AtomicInteger(0);
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "myScheConfig-" + max.incrementAndGet());
}
});
}
}
同時定時任務可以動態修改;
SchedulingConfigurer 動態修改定時規則,網上有兩種方法,都有缺點。
- 一種如下:
https://blog.csdn.net/xht555/article/details/53121962
此方法,是在觸發運行的時候,刷新定時規則,這種方法的缺點是,刷新規則的時間必須是在某次觸發運行的時候。
- 另一種是
https://blog.csdn.net/jianggujin/article/details/77937316
此方法基於 SchedulingConfigurer 的源碼,捕獲 ScheduledTaskRegistrar 類的實例,通過該類中的 TaskScheduler 實例操作定時任務的增刪,而非採用 ScheduledTaskRegistrar.addTriggerTask 方法維護定時任務。所以需要自行寫代碼維護定時任務列表,可以通過數據庫配置,來控制任務是否加載,刪減。
3.重量級一點的話,其實還是建議使用第三方開源組件 Quartz。
SpringBoot啓動定時任務
@EnableScheduling // 啓動定時任務