SpringBoot 定時任務Scheduled

  SpringBoot定時任務使用@EnableScheduling和@Scheduled這兩個註解就可以簡單實現,在集羣環境下建議用Quartz等實現。java

  很少說看代碼具體實現git

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.那些坑

  1. 首行啓動以後他會自動查找org.springframework.scheduling.TaskScheduler的Bean或者是 或者名爲「taskScheduler」的Bean或者 java.util.concurrent.ScheduledExecutorService的Bean 若是都找不到將會以本地單線程的方式執行。你會發現定時任務會一個執行完成以後纔會執行下一個。
  2. 若是是簡單的經過@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.0github

GitHub源碼spring

相關文章
相關標籤/搜索