摘要:本文我们将分享介绍如何基于Spring Boot搭建的项目使用Spring Task定时任务,带领各位小伙伴踩一踩在使用Spring定时任务时所出现的坑,并采用线程池~多线程任务调度的形式对出现的坑加以解决、优化!
内容:对于定时任务,相信各位小伙伴都有所耳闻,甚至有些小伙伴对定时任务的使用已经到了“炉火纯青”的地步!而事实上,在实际的项目、特别是企业级Spring的项目开发中, Spring Task定时任务的使用是相当频繁的。
本文我们将基于前文Spring Boot搭建的标准企业级项目作为奠基,采用注解的形式将Spring Task定时任务应用到项目中,那废话不多讲,咱们直接进入撸码环节!
(1)首先,我们在 com.debug.springboot.server 包目录下建立scheduler包目录,并在其下建立一个通用化的用于编写定时任务的CommonScheduler 类,如下源代码所示,我们建立了三个定时任务,其中每个定时任务执行的时间频率分别为每5s、每6s、每7s执行一次:
/**
* spring task-定时任务调度
* @Author:debug (SteadyJack)
* @Date: 2019/9/7 11:05
**/
@Component
public class CommonScheduler {
private static final Logger log= LoggerFactory.getLogger(CommonScheduler.class);
//定时任务1
@Scheduled(cron = "0/5 * * * * *")
public void schedulerOne(){
log.info("---执行定时任务1---");
}
//定时任务2
@Scheduled(cron = "0/6 * * * * *")
public void schedulerTwo(){
log.info("---执行定时任务2---");
try {
//模拟当前定时任务每次执行业务逻辑时需要花费的时间 3s
Thread.sleep(3000);
}catch (Exception e){e.printStackTrace();}
}
//定时任务3
@Scheduled(cron = "0/7 * * * * *")
public void schedulerThree(){
log.info("---执行定时任务3---");
try {
//模拟当前定时任务每次执行业务逻辑时需要花费的时间 4s
Thread.sleep(4000);
}catch (Exception e){e.printStackTrace();}
}
}
(2)其中,为了更好的模拟在实际项目开发中 定时任务 执行的业务逻辑,我们假定了每次执行定时任务2时需要花费3s的时间,定时任务3执行业务逻辑时需要花费4s的时间。
理论上,每个定时任务在执行相应的业务逻辑时,是不应该相互影响的,即在理想的情况下,SchedulerOne应当每隔5s执行一次业务逻辑,SchedulerTwo应当每隔6s执行一次业务逻辑,SchedulerThree应当每隔7s执行一次业务逻辑,以此类推。