最近的工作业务中,涉及到了一个动态的定时任务功能,用户在页面中生成cron表达式,后台进行一个动态定时任务的启停功能
1.实现SchedulingConfigurer接口,在重写的方法中为ScheduledTaskRegistrar创建一个定时任务,并把任务注册器拿到,后面设置cron要用到,因为ScheduledFuture初始化会调用一次afterPropertiesSet方法创建一个单线程的线程池,所以我们首次不需要运行,后执行执行该方法是覆盖之前的任务。这样就达到了动态更新定时任务的效果。缺点可能不适合多个定时任务场景,没试。。可自测
private ScheduledTaskRegistrar taskRegistrar=null;
/**
* 动态更新cron
* @param
*/
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
log.info("cron的值为:{}",cron);
if ( taskRegistrar.getScheduledTasks().size()>0){
taskRegistrar.afterPropertiesSet();
}
this.taskRegistrar=taskRegistrar;
taskRegistrar.addTriggerTask(this::prepareScan, triggerContext -> {
CronTrigger trigger = new CronTrigger(cron);
return trigger.nextExecutionTime(triggerContext);
});
}
触发方法:调用重写的该方法传入注册器和cron
/**
* 更改定时cron
*/
public void setCronTime(String cron) {
// 分页查询
this.setCron(cron);
this.configureTasks(taskRegistrar);
}