SpringBoot使用ScheduledFuture实现一个动态的定时任务

最近的工作业务中,涉及到了一个动态的定时任务功能,用户在页面中生成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);
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值