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

相关文章
相关标签/搜索