目录
- 一、项目场景
- 二、解决方案
- 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 测试与验证
- Nacos配置信息初始化(注意:nacos配置信息必须成功发布)
- 项目启动
- 打开
调度任务开关
并部署(注意:nacos配置信息必须成功发布) - 查看服务日志
- 修改
调度任务扫描频率
并部署(注意:nacos配置信息必须成功发布) - 查看服务日志
- 关闭
调度任务扫描频率
并部署(注意:nacos配置信息必须成功发布) - 查看服务日志
除了普通配置信息外,cron表达式也可以动态刷新了,美滋滋!
大功告成,搞饭搞饭
------__^__------