以前用 Springboot的@Scheduled作为定时任务管理,但是最近来了新需求,需要前端可以动态修改该定时任务的执行频率,因此修改成SchedulingConfigurer来做定时任务管理
@Component
public class DayTimerTask implements SchedulingConfigurer {
private final static Logger logger = LoggerFactory.getLogger(DayTimerTask.class);
//默认周一早上8点,数据中的时间格式必须严格保证* * * * * *否则项目启动会失败
private String expression = "0 0 8 ? * MON";
ScheduledTaskRegistrar taskRegistrar;
//该参数设置为false不从数据库获取,直接使用默认时间
private boolean isNewTask=true;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 定时任务要执行的方法
Runnable task = () -> {
//业务代码
pushMenuInfoService.pushWeekMenu();
logger.info(">>> 完成推送-----------时间为【"+expression+"】");
};
//如果是初始化任务,从数据库获取数据
if(isNewTask){
//自定义修改的时间
}
}
// 调度实现的时间控制
Trigger trigger = triggerContext -> {
CronTrigger cronTrigger = new CronTrigger(expression);
return cronTrigger.nextExecutionTime(triggerContext);
};
logger.info("当前推送时间:{}",expression);
taskRegistrar.addTriggerTask(task, trigger);
this.taskRegistrar=taskRegistrar;
}
/**
* 获取当前激活时间
* */
public String getExpression() {
return expression;
}
/**
* 手动管理定时任务的销毁与创建,只修改expression也可以动态修改,但是只会在下一次任务执行后才会被动修改时间,通过手动管理可以实时修改
* */
public void setExpression() {
//把初始化状态改成false不从数据库获取
// this.isNewTask=false;
//先停用旧的定时任务
this.taskRegistrar.destroy();
//以新选的时间,创建新的定时任务
ScheduledTaskRegistrar taskRegistrar = new ScheduledTaskRegistrar();
configureTasks(taskRegistrar);
//上一个定时任务已停止再添加新的定时任务
taskRegistrar.afterPropertiesSet();
}
}