spring boot的定时任务

1.启用定时任务

在启动类上增加注解@EnableScheduling,就启用了spring boot的定时任务

2.配置定时任务的配置文件

在一个被@Configuration标注的类上,增加注解@EnableAsync开启异步事件的支持。
然后增加配置

/*
   此处成员变量应该使用@Value从配置中读取
    */
    private int corePoolSize = 10;
    private int maxPoolSize = 20;
    private int queueCapacity = 10;

    // Executor 是 import java.util.concurrent.Executor;
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.initialize();
        return executor;
    }

这样做的目的是为了开启多线程支持定时任务。如果你不增加这个配置,同时你又有多个不同的定时任务在执行,那么执行定时任务的其实是同一个线程。 当有一个定时任务卡住时,其他的定时任务都不能执行。
配置了这个以后,每个定时任务都是一个单独的线程,自己执行自己的定时任务,互不影响。
但也有个问题,比如定时任务A是每10秒钟执行一次,在一次执行时卡住了,到了10秒的时候还没执行完,那么定时任务A会又启动一个新的线程来执行,也就是说你同时有两个定时任务A在执行,所以要注意这点,看是否对你有影响。

3. 增加定时任务代码

定时任务方法上要增加注解@Async,如果你不使用这个注解,那么你还是以一个线程来执行定时任务,不是多线程的

@Async
@Scheduled(cron = "0/10 * * * * ?")
public void process() {
    logger.info("#################### do something start ######################");


    logger.info("#################### do something end #######################");
}

4. 几种写法:

  1. @Scheduled(cron = “0/10 * * * * ?”) 表达式,没啥说的
  2. @Scheduled(fixedRate = 5000) 感觉跟表达式,差不多,每5秒执行一次
  3. @Scheduled(fixedDelay = 5000), 从测试结果看,依然是每5秒执行一次

你可能感兴趣的:(Java)