SpringBoot定時任務使用@EnableScheduling和@Scheduled這兩個註解就能夠簡單實現,在叢集環境下建議用Quartz等實現。
不多說看程式碼具體實現
1.首先開啟對Scheduled的支援
@Configuration
@EnableScheduling
public class ScheduledConfig {
}
複製程式碼
2.使用@Scheduled註解
@Service
public class ScheduleService {
@Scheduled(fixedDelay = 2000)
public void scheduleTest1() throws InterruptedException {
System.out.println("scheduleTest1 Start.>>" + new Date().toLocaleString());
Thread.sleep(6000);
System.out.println("scheduleTest1 End.>>" + new Date().toLocaleString());
}
@Scheduled(fixedRate = 2000)
public void scheduleTest2() throws InterruptedException {
System.out.println("scheduleTest2 Start.>>" + new Date().toLocaleString());
Thread.sleep(6000);
System.out.println("scheduleTest2 End.>>");
}
@Scheduled(cron = "0 0/1 * * * ? ")
public void scheduleTest3() {
System.out.println("scheduleTest3 >>>");
}
@Scheduled(fixedRate = 2000, initialDelay = 1000)
public void scheduleTest4() throws InterruptedException {
System.out.println("scheduleTest2 fixedRate Start.>>");
Thread.sleep(6000);
System.out.println("scheduleTest2 fixedRate End.>>");
}
}
複製程式碼
3.Scheduled註解中引數解釋
- fixedDelay,fixedDelayString 都表式上次任務完成之後,多少毫秒後開始下一個任務
- fixedDelay 傳毫秒數
- fixedDelayString 毫秒的String值或者java.time.Duration 型別想匹配的時間 比如PT20.345S
- fixedRate,fixedRateString 表式上次執行之後多少毫秒後開始下一個任務
- fixedRate 傳毫秒數
- fixedRateString 毫秒的String值或者java.time.Duration 型別想匹配的時間
- initialDelay,initialDelayString 延遲多少毫秒執行
- cron 使用cron表示式來表示
4.那些坑
- 首行啟動之後他會自動查詢org.springframework.scheduling.TaskScheduler的Bean或者是 或者名為“taskScheduler”的Bean或者 java.util.concurrent.ScheduledExecutorService的Bean 如果都找不到將會以本地單執行緒的方式執行。你會發現定時任務會一個執行完成之後才會執行下一個。
- 如果是簡單的通過@EnableAsync 然後再方法上註解@Async後,則fixedDelay/fixedDelayString引數將失效等同於fixedRate/fixedRateString,因為方法上加@Async註解之後等同於該方法為非同步方法,不會等待任務完成
5.配置多執行緒執行
@Bean
public ScheduledExecutorService scheduledExecutorService() {
return new ScheduledThreadPoolExecutor(10);
}
複製程式碼
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(20);
return threadPoolTaskScheduler;
}
複製程式碼
@Configuration
@EnableScheduling
public class ScheduledConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod = "shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(20);
}
}
複製程式碼
【注】程式碼基於SpringBoot 2.0