spring-boot定时任务@Scheduled怎么实现动态获取

1. 需求场景

在每天定时的需要去扫描数据库的info表,需要根据当前时间来判断当前活动的状态,需要用到@Scheduled定时任务,但是考虑到后期有可能会更改cron表达式,所以这边就做成了动态获取的状态

2. 创建定时任务表

create table patrol_job
(
    cron_id     bigint(20) not null auto_increment comment '定时任务id',
    cron_name   varchar(200) not null default '' comment '定时任务名称',
    cron        varchar(64)  not null default '' comment '定时时间',
    create_by   varchar(64)  not null default '' comment '创建者',
    update_by   varchar(64)  not null default '' comment '更新者',
    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP comment '更新时间',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP comment '创建时间',
    primary key (cron_id)
) engine=innodb comment = '巡视定时任务表';

3. @Scheduled使用的注意步骤

@Configuration-->加载配置信息
@EnableScheduling-->开启定时任务
 

4.具体代码

@Slf4j
@Configuration
@EnableScheduling
public class SysMyTask implements SchedulingConfigurer {

    public void myTaskMethod() {
        log.info("巡视定时任务开始了 : {}", new Date());
        // 定时任务逻辑

        log.info("巡视定时任务结束了: {}", new Date());
    }


  @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(() -> myTaskMethod(), triggerContext -> {
            // 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
            PatrolJob patrolJob = sysPatrolJobMapper.selectById(1);
            if (patrolJob.getCron().isEmpty()) {
                throw new RuntimeException("cron为空");
            }
            CronTrigger cronTrigger = new CronTrigger(patrolJob.getCron());
            Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);
            return nextExecutionTime;
        });
    }

}

注意点:

cron在动态获取的时候,不会实时去加载你新的cron表达式,而是在下一次执行之前的任务,才会记录到最新的cron表达式,所以在这一块,需要注意一点 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值