SpringBoot调度任务基于nacos配置动态修改过程

 更新时间:2026年06月12日 09:09:24   作者:上善会若水  
SpringBoot调度任务与Nacos配置集成,通过实现SchedulingConfigurer接口动态修改cron表达式,实现任务调度的灵活配置;注意任务停止后需借助Quartz或XXL-JOB等实现动态启动

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

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表达式执行调度任务。 

不过还是有个小坑

就是一旦调度任务停止了,即便动态修改也没什么用,因为任务都不执行了。如果要想动态启动需要借助quartz或者分布式调度平台比如XXL-JOB等实现。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java反应式框架Reactor中的Mono和Flux

    Java反应式框架Reactor中的Mono和Flux

    这篇文章主要介绍了Java反应式框架Reactor中的Mono和Flux,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • Spring配置文件中parent与abstract的使用

    Spring配置文件中parent与abstract的使用

    这篇文章主要介绍了Spring配置文件中parent与abstract的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java之键盘输入语句Scanner解读

    Java之键盘输入语句Scanner解读

    这篇文章主要介绍了Java之键盘输入语句Scanner解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • java图片格式转换的三段代码

    java图片格式转换的三段代码

    这篇文章主要分享了java图片格式转换的三段代码,小编查找资料整理了java图片格式转换的三段不同代码,推荐给大家。
    2015-11-11
  • java Object转Integer实现方式

    java Object转Integer实现方式

    这篇文章主要介绍了java Object转Integer实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java SpringMVC实现国际化整合案例分析(i18n)

    Java SpringMVC实现国际化整合案例分析(i18n)

    本篇文章主要介绍了Java SpringMVC实现国际化整合案例分析(i18n),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • SpringBoot加载读取配置文件过程详细分析

    SpringBoot加载读取配置文件过程详细分析

    在实际的项目开发过程中,我们经常需要将某些变量从代码里面抽离出来,放在配置文件里面,以便更加统一、灵活的管理服务配置信息。所以本文将为大家总结一下SpringBoot加载配置文件的常用方式,需要的可以参考一下
    2023-01-01
  • 解决Maven项目pom.xml导入了Junit包还是用不了@Test注解问题

    解决Maven项目pom.xml导入了Junit包还是用不了@Test注解问题

    在Maven项目中,如果在非test目录下使用@Test注解,可能会因为pom.xml中<scope>test</scope>的设置而无法使用,正确做法是将测试代码放在src/test/java目录下,或去除<scope>test</scope>限制,这样可以确保Junit依赖正确加载并应用于适当的代码部分
    2024-10-10
  • Java多线程中常见的锁策略详解

    Java多线程中常见的锁策略详解

    这篇文章主要介绍了Java多线程中常见的锁策略详解,在Java多线程中锁(synchronized)也会根据锁的竞争程度来升级为相关“高等级”锁,本文为了更好的理解 synchronized 加锁机制,对其做出了详细解释,需要的朋友可以参考下
    2023-07-07
  • Java21增强对Emoji表情符号处理示例详解

    Java21增强对Emoji表情符号处理示例详解

    这篇文章主要为大家介绍了Java21增强对Emoji表情符号处理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11

最新评论