Spring的定時任務簡介

方式一:使用註解
@Component
@EnableScheduling//可以在啓動類上註解也可以在當前文件
public class TestJob {
 
    @Scheduled(cron = "0/10 * * * * ?")
    public void runfirst(){
        System.out.println("********first job is ok******");
    }
 
    @Scheduled(fixedRate = 1000 * 10)
    public void runsecend(){
        System.out.println("********second job is ok******");
    }
 
    @Scheduled(fixedDelay=1000)
    public void runThird(){
        System.out.println("********third job is ok*******");
    }
}
@EnableScheduling 註解的作用是發現註解@Scheduled的任務並後臺執行。@Scheduled用於標註這個方法是一個定時任務的方法cron、fixedRate、fixedDelay三個是用來調度時間的這三種方式都是設置每隔十秒執行一次

fixedRate:表示Scheduled隔多長時間調用一次,不管任務是否執行完fixedDelay:表示該任務執行完後隔多長時間再調用cron是以表達式的形式來表示時間,從其他博主上摘抄了幾個例子,相信看一下基本都沒問題了。

表達式 意義:

“0 0 12 * * ?”                每天中午12點觸發
 
“0 15 10 ? * *”               每天上午10:15觸發
 
“0 15 10 * * ?”               每天上午10:15觸發
 
“0 15 10 * * ? *”             每天上午10:15觸發
 
“0 15 10 * * ? 2005”          2005年的每天上午10:15 觸發
 
“0 * 14 * * ?”                在每天下午2點到下午2:59期間的每1分鐘觸發
 
“0 0/5 14 * * ?”              在每天下午2點到下午2:55期間的每5分鐘觸發
 
“0 0/5 14,18 * * ?”           在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發
 
“0 0-5 14 * * ?”              在每天下午2點到下午2:05期間的每1分鐘觸發
 
“0 10,44 14 ? 3 WED”          每年三月的星期三的下午2:10和2:44觸發
 
“0 15 10 ? * MON-FRI”         週一至週五的上午10:15觸發
 
“0 15 10 15 * ?”              每月15日上午10:15觸發
 
“0 15 10 L * ?”               每月最後一日的上午10:15觸發
 
“0 15 10 ? * 6L”              每月的最後一個星期五上午10:15觸發
 
“0 15 10 ? * 6L 2002-2005”    2002年至2005年的每月的最後一個星期五上午10:15觸發
 
“0 15 10 ? * 6#3”             每月的第三個星期五上午10:15觸發
 
0 6 * * *                     每天早上6點
 
0 /2 * *                      每兩個小時
 
0 23-7/2,8 * * *             晚上11點到早上8點之間每兩個小時,早上八點
 
0 11 4 * 1-3                  每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點
 

方式二:使用接口SchedulingConfigurer:
 
@Configuration
@ComponentScan(value = "com.es.evaluation_teaching_wp.utils")
@EnableScheduling
public class Config implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
 
        taskRegistrar.addFixedRateTask(new Runnable() {
            @Override
            public void run() {
                System.out.println("addFixedRateTask new Runnable() 定時任務執行了。");
            }
        },100);
 
        taskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
                System.out.println("addTriggerTask new Runnable() 定時任務執行了。");
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                // 定時任務觸發,可修改定時任務的執行週期
                CronTrigger trigger = new CronTrigger("*/2 * * * * ?");
                Date nextExecDate = trigger.nextExecutionTime(triggerContext);
                return nextExecDate;
            }
        });
        
      //或者使用JDK 1.8的Lambda表達式
        taskRegistrar.addFixedRateTask(() -> System.out.println("Lambda表達式,執行定時任務1: " + new Date()), 1000);
        TriggerTask triggrtTask = new TriggerTask( // 任務內容.拉姆達表達式
                () -> {System.out.println("Lambda表達式,執行定時任務2: " + new Date());},
                // 設置觸發器,這裏是一個拉姆達表達式,傳入的TriggerContext類型,返回的是Date類型
                triggerContext -> {
                    // 2.3 返回執行週期(Date)
                    return new CronTrigger("*/2 * * * * ?").nextExecutionTime(triggerContext);
                });
 
        taskRegistrar.addTriggerTask(triggrtTask);
 
    }
 
 
}
 
多線程配置:

默認的,SchedulingConfigurer 使用的也是單線程的方式,如果需要配置多線程,則需要指定 PoolSize,加入如下代碼即可:

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    taskScheduler.setPoolSize(10);
    taskScheduler.initialize();
    taskRegistrar.setTaskScheduler(taskScheduler);
}
動態修改定時規則:

可以定義一個 cron變量,提供set方法,由外部根據不同條件而修改cron表達式的值;

/**
 * @description:動態修改定時任務cron參數
 */
@Component
@EnableScheduling
public class TestTask implements SchedulingConfigurer {
  
    private static String cron =  "0 0/1 * * * ?";
  
       public void setCron(String cron) {
        this.cron = cron;
    }
  
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
                // 定時任務的業務邏輯
                System.out.println("1動態修改定時任務cron參數。" )
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                // 定時任務觸發,可修改定時任務的執行週期
                CronTrigger trigger = new CronTrigger(cron);
                Date nextExecDate = trigger.nextExecutionTime(triggerContext);
                return nextExecDate;
            }
        });
    }
}
 

2.另一種是

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

此方法基於 SchedulingConfigurer 的源碼,捕獲 ScheduledTaskRegistrar 類的實例,通過該類中的 TaskScheduler 實例操作定時任務的增刪,而非採用 ScheduledTaskRegistrar.addTriggerTask 方法維護定時任務。所以需要自行寫代碼維護定時任務列表,控制任務的刪減,代碼的實現比較繁瑣。

如果想要實現可以動態修改的定時策略,建議使用開源組件 Quartz。
————————————————
版權聲明:本文爲CSDN博主「詩人與黑客」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_41899174/article/details/89857259

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