本章介绍Spring Boot中定时器的使用方法,总结个人对一些定时器用法的了解,如有错误欢迎指正。
定时器是什么?
定时器就是让程序定时执行某些任务,不需要人工手动执行。
为什么要使用定时器?
使用定时器,有很多好处。举个例子:在平台api对接中,请求通常需要携带token信息,而token有可能有固定时效。在token失效后,需要重新获取token信息。此时可以使用定时任务重新获取token。
怎么用定时器?
在Java中,有很多中方式处理定时任务。Timer,SpringBoot的@Scheduled注解,SpringBoot整合Quartz等方式。
整合Quartz
Spring Boot中使用Quartz是通过继承QuartzJobBean的方式,创建JobDetail和Trigger以达到定时效果。
1、创建SimpleScheduleExtendsQuartzJobTask任务类
package com.study.controller.schedule; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; import java.util.Date; public class SimpleScheduleExtendsQuartzJobTask extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("do schedule extends quartz job task " + new Date()); } }
2、创建JobDetail和Trigger。创建JobDetail时需要使用JobBuilder.newJob()方法添加任务类,withIdentity()方法指定key,build()方法进行构建。TriggerBuilder.forJob()方法添加JobDetail,withSchedule()方法添加schedule。schedule可以通过SimpleScheduleBuilder进行构建,withIntervalInSeconds()指明每次执行定时任务的间隔时间。
package com.study.config; import com.study.controller.schedule.SimpleScheduleExtendsQuartzJobTask; import org.quartz.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SimpleScheduleConfig { @Bean public JobDetail simpleJobBeanDetails() { return JobBuilder.newJob(SimpleScheduleExtendsQuartzJobTask.class).withIdentity("simpleJobBean").storeDurably().build(); } @Bean public Trigger simpleTrigger() { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(15).repeatForever(); return TriggerBuilder.newTrigger().withIdentity("simpleTrigger").forJob(simpleJobBeanDetails()).withSchedule(scheduleBuilder).build(); } }
上述方法已经可以到达效果,但仍然有需要改进的地方。我们来思考几个问题:
1、有大量的定时任务时如何解决?
2、当某个任务的执行时间需要修改时如何解决?
3、如何控制任务的启动和停止?