实现定时任务的方案如下:
1、使用jdk的Timer和TimerTask实现
可以实现简单的间隔执行任务,无法实现按日历去调度执行任务。2、使用Quartz实现 Quartz 是一个异步任务调度框架,功能丰富,可以实现按日历调度。3、使用Spring Task实现 Spring 3.0后提供Spring Task实现任务调度,支持按日历调度,相比Quartz功能稍简单,但是在开发基本够用,支持注解编程方式。1. 串行任务
1.1 编写任务类
在Spring boot启动类上添加注解:@EnableScheduling
新建任务测试类TestTask,编写测试方法如下:
@Componentpublic class ChooseCourseTask { private static final Logger LOGGER = LoggerFactory.getLogger(ChooseCourseTask.class); // @Scheduled(fixedRate = 5000) //上次执行开始时间后5秒执行 // @Scheduled(fixedDelay = 5000) //上次执行完毕后5秒执行 // @Scheduled(initialDelay=3000, fixedRate=5000) //第一次延迟3秒,以后每隔5秒执行一次 @Scheduled(cron="0/3 * * * * *")//每隔3秒执行一次 public void task1(){ LOGGER.info("===============测试定时任务1开始==============="); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } LOGGER.info("===============测试定时任务1结束==============="); }}
测试:
1、测试fixedRate和fixedDelay的区别 2、测试串行执行的特点参考 task1方法的的定义方法,再定义task2方法,此时共用两个任务方法。
通过测试发现,两个任务方法由一个线程串行执行,task1方法执行完成task2再执行。2. 并行任务
2.1 需求分析
在项目通常是需要多个不同的任务并行去执行。
2.2 配置异步任务
创建异步任务配置类,需要配置线程池实现多线程调度任务。
@Configuration@EnableSchedulingpublic class AsyncTaskConfig implements SchedulingConfigurer, AsyncConfigurer { //线程池线程数量 private int corePoolSize = 5; @Bean public ThreadPoolTaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.initialize();//初始化线程池 scheduler.setPoolSize(corePoolSize);//线程池容量 return scheduler; } @Override public Executor getAsyncExecutor() { Executor executor = taskScheduler(); return executor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { scheduledTaskRegistrar.setTaskScheduler(taskScheduler()); }}
将@EnableScheduling添加到此配置类上,SpringBoot启动类上不用再添加@EnableScheduling