记录一个以SchedulingConfigurer动态修改定时任务执行时间

以前用 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();
}

}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值