方式一:使用註解
@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