实现动态修改定时器的cron属性
大多数的时候我们设定定时器,是使用@Scheduled注解,然后在配置文件或者直接写死cron属性
@Configuration //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling // 2.开启定时任务
public class scheduler{
//添加定时任务
@Scheduled(cron = "0/5 * * * * ?")
private void schedulerMethod() {
System.err.println("执行定时任务逻辑");
}
}
这样写的话,若想修改cron属性则需要改代码或者配置文件,然后重启服务才能生效。
那么怎样实现动态修改cron属性,并且也不用重启服务呢?
实现动态修改cron
public class scheduler implements SchedulingConfigurer{
//定时任务方法
private void schedulerMethod() {
System.err.println("执行定时任务逻辑");
}
//每次执行完定时任务,都会重新执行一次configureTasks方法,根据参数重新设定定时器的执行时间
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
//1.添加任务内容(Runnable)
() -> {
schedulerMethod();
},
//2.设置执行周期(Trigger)
triggerContext -> {
//2.1 从数据库获取执行周期
//这里的意思是数据库查出对应的cron属性
String cron = sysParamConfigRest.getParamValue("TrackScheduler_cron");
//2.2 合法性校验.
if (StringUtils.isBlank(cron)) {
// Omitted Code ..
logger.info("trackScheduler定时器的cron参数为空!!!!!");
//如果为空则赋默认值
cron = "0 0 /1 * * ? ";
}
//2.3 返回执行周期(Date)
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}
}