运行时修改定时任务间隔

背景:

项目经理提了一个需求,要我在当前系统中添加一个定时发邮件的任务。但是要求能随时修改执行间隔,而不是固定的间隔。

思考:
通过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等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值