https://blog.csdn.net/qq_35992900/article/details/80429245
我们主要讲解它的动态配置使用方法。 在刚开始使用的时候,我们更改一个任务的执行时间,一般是这样的:修改定时任务的执行周期,把服务停下来,改下任务的cron参数,再重启服务就搞搞定了。这种方式很简单,没有可说的,但是有没有一种可能,在不停服务的情况下,就可以动态的修改任务的cron参数呢?那是必须有! 刚刚提到的方法里,我们在主类上面加@EnableScheduling注解,在任务方法前面加上@Scheduled(cron =“0/5 * * * * *”)注解定义执行时间,但是动态配置的步骤就有点不一样: 1. 在定时任务类上增加@EnabledScheduling注解,并实现SchedulingConfigurer接口。 2. 设置一个静态的cron,用于存放任务执行周期参数。 3. 从数据库获取Cron参数,用于模拟实际业务中外部原因修改了任务执行周期。 4. 设置任务触发器,触发任务执行。 ————————————————
import java.util.Date; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Component @EnableScheduling public class TaskCronChange implements SchedulingConfigurer{ public static String cron; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { //项目部署时,会在这里执行一次,从数据库拿到cron表达式 cron = timerQueryMapper.getCronTime(); Runnable task = new Runnable() { @Override public void run() { //任务逻辑代码部分. System.out.println("I am going:" + LocalDateTime.now()); } }; Trigger trigger = new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { //任务触发,可修改任务的执行周期. //每一次任务触发,都会执行这里的方法一次,重新获取下一次的执行时间 cron = timerQueryMapper.getCronTime(); CronTrigger trigger = new CronTrigger(cron); Date nextExec = trigger.nextExecutionTime(triggerContext); return nextExec; } }; taskRegistrar.addTriggerTask(task, trigger); } }
因为是要任务执行一次的时候才会去修改时间的cron表达式,所以改了cron后,要在下下次任务执行时才会生效。
这里核心的主要是使用到了ScheduledTaskRegistrar这个类有一个方法addTriggerTask(Runnable,Trigger) 两个参数,一个Runnable,一个是Trigger,在Runnable中执行业务逻辑代码,在Trigger修改定时任务的执行周期。