SpringBoot 定時任務

SpringBoot:定時任務

定時任務@Scheduler

Spring支持使用註解@Scheduler標記定時任務。
@Scheduler可以傳入六個參數,分爲下面四種:

  1. fixedDelay: 每次方法執行完畢後,等待Nms再執行此方法。(fixedDelayString與他一樣,只是參數是字符串,重點支持佔位符,如${})
    eg:@Scheduled(fixedDelay=1000)
  2. fixedRate: 每隔5s調用一次此方法,無論之前的方法是否執行完畢.(fixedRateString這個與他一樣,參數爲String,重點支持佔位符,如${})
    eg: @Scheduled(fixedRate=5000)
  3. initialDelay: 第一次調用此方法前的等待時間
    eg:@Scheduled(initialDelay=1000, fixedRate=5000),同樣,存在(initialDelayString,支持佔位符)
  4. 最後是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 動態修改定時規則,網上有兩種方法,都有缺點。

  1. 一種如下:

https://blog.csdn.net/xht555/article/details/53121962

此方法,是在觸發運行的時候,刷新定時規則,這種方法的缺點是,刷新規則的時間必須是在某次觸發運行的時候。

  1. 另一種是

https://blog.csdn.net/jianggujin/article/details/77937316

此方法基於 SchedulingConfigurer 的源碼,捕獲 ScheduledTaskRegistrar 類的實例,通過該類中的 TaskScheduler 實例操作定時任務的增刪,而非採用 ScheduledTaskRegistrar.addTriggerTask 方法維護定時任務。所以需要自行寫代碼維護定時任務列表,可以通過數據庫配置,來控制任務是否加載,刪減。

3.重量級一點的話,其實還是建議使用第三方開源組件 Quartz。

SpringBoot啓動定時任務

 @EnableScheduling // 啓動定時任務
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章