背景:
项目经理提了一个需求,要我在当前系统中添加一个定时发邮件的任务。但是要求能随时修改执行间隔,而不是固定的间隔。
思考:
通过Springboot的定时任务实现定时发送,但是没有办法去动态修改这个执行间隔。在项目启动后就已经定下每次的执行间隔。
也可以去通过一个while(true)方法,一直去获取执行周期,判断是否需要执行,但是这个方式性能损耗较大。需要有个方法一直去查询。
解决:
后来看到一个解决办法,就是通过实现SchedulingConfigurer接口创建一个自定义Schedule,每次执行时同步查询corn表达式,决定下次执行时间
@Slf4j
@Component
public class CustomizeSchedule implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
//1.添加任务内容(Runnable)
this::doTask,
//2.设置执行周期(Trigger)
triggerContext -> {
//2.1 从数据库获取执行周期
//2.3 返回执行周期(Date)
return new CronTrigger(Objects.requireNonNull(getCorn())).nextExecutionTime(triggerContext);
}
);
}
其中的getCorn()就是从数据库中读取执行周期的corn表达式,决定下次执行时间。
结果:
这样就可以把间隔配置保存到数据库中,每次执行时动态查询数据库,确定下次执行时间。
不足:
这个方法 修改了时间间隔并不会立马生效,需要等到最近的一次执行时间后,才会生效。最好的办法还是借助于任务调度平台,比如xxl-job,elasticJob等