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. 几种写法:
- @Scheduled(cron = “0/10 * * * * ?”) 表达式,没啥说的
- @Scheduled(fixedRate = 5000) 感觉跟表达式,差不多,每5秒执行一次
- @Scheduled(fixedDelay = 5000), 从测试结果看,依然是每5秒执行一次