SpringCloud+Nacos项目中动态刷新配置(支持Cron表达式动态刷新)

一、项目场景

项目说明:spring cloud项目,nacos配置中心
项目场景:项目在nacos配置中心中配了较多配置信息,而且也可以实现动态刷新(springcloud+nacos实现配置动态刷新)),对于普通配置信息,用于获取后赋值给变量使用,但是对于Cron表达式,上面博文的方式无法实现动态刷新,甚至使用不当会导致nacos配置信息一旦修改并部署后,若不重启项目,项目中正在运行的的定时任务可能会失效


二、解决方案

2.1创建相关类

配置信息类Myproperties

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

@Component
@Data
@RefreshScope
public class MyProperties {

    //接口开关
    @Value("${test.switch}")
    String testSwitch;

    //接口开关
    @Value("${test.cron}")
    String testCron;
}

通用工具类CommonUtils

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class CommonUtils {
    private static final Logger logger = LoggerFactory.getLogger(CommonUtils.class);

    @Autowired
    MyProperties properties;

    public boolean autoCreateSwitchIsOpen(){
        String autoCreateSwitch = properties.getTestSwitch();
        boolean flag = true;
        logger.info("NACOS中自动创建开关flag:{}",autoCreateSwitch);
        if(!"true".equals(autoCreateSwitch)){
            logger.info("自动创建功能处于关闭状态,不会自动生成周报!");
            flag = false;
        }
        return flag;
    }
}

定时任务类MyScheduleTask1

import com.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
//这里使用会创建两个调度任务-弃用
//@RefreshScope
public class MyScheduleTask1 implements SchedulingConfigurer {
    private static final Logger logger = LoggerFactory.getLogger(MyScheduleTask1.class);

    @Autowired
    MyProperties properties;
    @Autowired
    CommonUtils commonUtils;

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        //执行任务 使用addTriggerTask 方法
        taskRegistrar.addTriggerTask(
                //实现自己的调度任务业务逻辑
                () -> autoCreateWorkReport(), //业务逻辑
                //实现触发器逻辑
                triggerContext -> {
                    String cron = properties.getTestCron(); //从nacos中取动态的cron表达式
                    if(StringUtils.isEmpty(cron)){
                        cron = "0 0/2 * * * ?"; //默认配置:每2min执行一次
                    }
                    logger.info("当前自动创建周报任务频率:{}", cron);
                    //这边获取动态配置后执行 计算下次促发时间
                    CronTrigger trigger = new CronTrigger(cron);
                    Date nextExec = trigger.nextExecutionTime(triggerContext);
                    return nextExec;
                });
    }

    private void autoCreateWorkReport(){
        try {
            //判断调度任务的开关
            if (!commonUtils.autoCreateSwitchIsOpen()) return;

            //实现调度任务的业务逻辑
            logger.info("----------------------开始创建周报...当前时间:{}",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            //模拟创建周报
            logger.info("周报生成完毕!");
            logger.info("周报发送完毕!");
            Thread.sleep(1000); //模拟任务耗时
            //模拟记录创建日志
            logger.info("创建周报信息,记录创建日志表完成");
            logger.info("----------------------周报搞完喽,回家吃饭!");
        }catch (Exception e){
            logger.error("!!!!!创建周报失败!{}",e.getMessage());
            e.printStackTrace();
            //记录创建日志表
            logger.info("创建周报失败信息,记录创建日志表完成");
        }
    }
}

2.2 测试与验证

  1. Nacos配置信息初始化(注意:nacos配置信息必须成功发布)
    在这里插入图片描述

  2. 项目启动
    在这里插入图片描述

  3. 打开调度任务开关并部署(注意:nacos配置信息必须成功发布)
    在这里插入图片描述

  4. 查看服务日志
    在这里插入图片描述

  5. 修改调度任务扫描频率并部署(注意:nacos配置信息必须成功发布)
    在这里插入图片描述

  6. 查看服务日志
    在这里插入图片描述

  7. 关闭调度任务扫描频率并部署(注意:nacos配置信息必须成功发布)
    在这里插入图片描述

  8. 查看服务日志
    在这里插入图片描述


除了普通配置信息外,cron表达式也可以动态刷新了,美滋滋!

大功告成,搞饭搞饭 ------__^__------

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迟到_啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值