欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot中 @Scheduled调度任务基于nacos配置动态修改

程序员文章站 2022-05-29 18:54:06
...

Spring框架自3.0版本起,自带了任务调度功能,好比是一个轻量级的Quartz,而且使用起来也方便、简单,且不需要依赖其他的JAR包。
  在springboot中使用更加方便,只需要在类头加上注解@Configuration 和@EnableScheduling,
然后方法上使用@Scheduled(cron="cron = “0 0/5 * * * ?”)就可以一个简单的调度任务就可以实现了。

@Component
@Configuration      //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling // 2.开启定时任务
public class XXXJob {

    //日志
    private Logger logger = LoggerFactory.getLogger(XXXJob.class);


    @Scheduled(cron = "0 0/5 * * * ?")
    public void excuteTask() {
        logger.info("XXX的task,开始!");

        // do 执行的业务逻辑

        logger.info("XXX的task,结束!");
    }

上面的方法都是基于固定的cron表达式,有没有简单的实现动态的配置呢?
我们可以基于nacos实现简单的动态配置方法

首先我们的调度任务要实现SchedulingConfigurer接口

@Component
@Configuration
@EnableScheduling
//类要实现 SchedulingConfigurer接口
public class XXXTask implements SchedulingConfigurer {

    //实现接口的方法
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

        //执行任务 使用addTriggerTask 方法
        taskRegistrar.addTriggerTask(
        //第一个方法 实现自己的调度任务业务逻辑
        () -> executeYearBill(), //业务逻辑
        //实现触发器逻辑
        triggerContext -> {
            //从nacos中取动态的cron表达式
            String cron = nacosUtil.getXXXCron();//获取配置自己实现nacos方法
            //判断nacos是否有配置cron表达式,如果没有给一个默认配置
            if(StringUtils.isEmpty(cron)){
                cron = "0/2 * * * * ?"; //默认配置 比如每2秒执行一次
            }
            logger.info("当前触发器……"+cron);
            //这边获取动态配置后执行 计算下次促发时间
            CronTrigger trigger = new CronTrigger(cron);
            Date nextExec = trigger.nextExecutionTime(triggerContext);
            return nextExec;
        });

    }
}

这种方法可以简单动态的实现nacos配置修改而实时cron表达式执行调度任务。
不过还是有个小坑,就是一旦调度任务停止了,即便动态修改也没什么用,因为任务都不执行了。如果要想动态启动需要借助分布式调度平台比如XXL-JOB等实现