使用SpringBoot創建定時任務非常簡單,只需在添加幾個註解就可以實現定時任務。
@Component
@EnableScheduling //在啓動類上註解也可以
public class TestJob {
@Scheduled(cron = "0/10 * * * * ?")
public void task1(){
System.out.println(“----任務一----”);
}
@Scheduled(fixedRate = 1000 * 10)
public void task2(){
System.out.println(“----任務二----”);
}
@Scheduled(fixedDelay=1000)
public void task3(){
System.out.println(“----任務三----”);
}
}
在上面的定時任務中,我們在方法上使用@Scheduled註解來設置任務的執行時間,並且使用三種屬性配置方式:
- fixedRate:間隔時間是根據上次任務開始的時候計時的
- fixedDelay:間隔時間是根據上次的任務結束的時候開始計時的
- cron:通過表達式來配置任務執行時間
cron表達式詳解
一個cron表達式有至少6個(也可能7個)有空格分隔的時間元素。按順序依次爲:
- 秒(0~59) 例如0/5表示每5秒
- 分鐘(0~59)
- 小時(0~23)
- 日(0~31)的某天,需計算
- 月(0~11)
- 周幾( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)
- 年份(1970-2099)
一些表達式案例:
- “0 0 10,14,16 * * ?” 每天上午10點,下午2點,4點
- “0 0/30 9-17 * * ?” 每天早上9點到晚上5點每半小時
- “0 0 12 ? * WED” 表示每個星期三中午12點
- “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觸發
- “0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最後一個星期五上午10:15觸發
- “0 15 10 ? * 6#3” 每月的第三個星期五上午10:15觸發
spring的定時任務默認是單線程的,不會開啓另一條線程去執行任務,如果有多個任務需要等待上一個任務執行完成後,再去執行下一個任務。下面我們添加一個類來實現多線程並行執行任務,只要到了執行時間,不需要等待其它任務執行完畢就可以開始執行任務。
package com.instudio.ebay.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(20);
}
}
只需添加上面的,就可以實現多個任務並行。