目录

  • 一、项目场景
  • 二、解决方案
  • 2.1创建相关类
  • 配置信息类Myproperties
  • 通用工具类CommonUtils
  • 定时任务类MyScheduleTask1
  • 2.2 测试与验证


一、项目场景

项目说明:spring cloud项目,nacos配置中心
项目场景:项目在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. nacos 配置redis cluster nacos 配置刷新_动态配置

  3. 项目启动
  4. nacos 配置redis cluster nacos 配置刷新_nacos_02

  5. 打开调度任务开关并部署(注意:nacos配置信息必须成功发布)
  6. nacos 配置redis cluster nacos 配置刷新_nacos_03

  7. 查看服务日志
  8. nacos 配置redis cluster nacos 配置刷新_springcloud_04

  9. 修改调度任务扫描频率并部署(注意:nacos配置信息必须成功发布)
  10. nacos 配置redis cluster nacos 配置刷新_refreshScope_05

  11. 查看服务日志
  12. nacos 配置redis cluster nacos 配置刷新_refreshScope_06

  13. 关闭调度任务扫描频率并部署(注意:nacos配置信息必须成功发布)
  14. nacos 配置redis cluster nacos 配置刷新_nacos_07

  15. 查看服务日志
  16. nacos 配置redis cluster nacos 配置刷新_springcloud_08


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

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