动态修改定时器的下次执行时间
一. 启动类中添加开启定时器注解@EnableScheduling
@SpringBootApplication
@EnableScheduling
public class AdminServer {
public static void main(String[] args) {
SpringApplication.run(AdminServer.class, args);
}
};
二. 定义定时器service类
@Service
public class SchedulerService implements SchedulingConfigurer {
private static Logger LOGGER = LoggerFactory.getLogger(DynamicScheduler.class);
@Bean
public TaskScheduler poolScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("ThreadPoolTaskScheduler");
scheduler.setPoolSize(1);
scheduler.initialize();
return scheduler;
}
//我们可以在同一个注册器中执行多个任务,如下所示。
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(poolScheduler());
//下一个执行时间取自数据库,因此如果数据库中的值更改,下一个执行时间也将更改。
taskRegistrar.addTriggerTask(() -> scheduledDatabase(5), t -> { //scheduledDatabase(5) 这个参数时间只是为了测试,可从其他地方获取到参数进行传参
Calendar nextExecutionTime = new GregorianCalendar();
Date lastActualExecutionTime = t.lastActualExecutionTime();
nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
nextExecutionTime.add(Calendar.SECOND, 5); //此时间是需要替换的时间,也是下一次定时器执行的时间
return nextExecutionTime.getTime();
});
//可以有多个任务
taskRegistrar.addTriggerTask(() -> scheduleFixed(), t -> {
Calendar nextExecutionTime = new GregorianCalendar();
Date lastActualExecutionTime = t.lastActualExecutionTime();
nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
nextExecutionTime.add(Calendar.SECOND, 7);
return nextExecutionTime.getTime();
});
//或者cron方式,也可以从DB或其他地方获取表达式,就像我们上面所做的那样。
CronTrigger croneTrigger = new CronTrigger("0/10 * * * * ?", TimeZone.getDefault());
taskRegistrar.addTriggerTask(() -> scheduleCron("0/10 * * * * ?"), croneTrigger);
}
// 定时执行的方法 (此方法可以定义在任意类中)
public void scheduledDatabase(int time) {
//业务方法
LOGGER.info("scheduledDatabase: 下次执行时间将从数据库中获取 -> {}", time +"===============>" + new Date());
}
//我添加这个是为了显示一个任务注册器可以有多个不同的任务。
public void scheduleFixed() {
LOGGER.info("scheduleFixed: 下一次执行时间始终为7秒");
}
// 此方法获取cron 参数的唯一原因是出于调试目的。
public void scheduleCron(String cron) {
LOGGER.info("scheduleCron: 下一次执行此操作的时间取自cron表达式 -> {}", cron);
}
}