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等实现
上一篇: react-native expo踩坑
下一篇: Mybatis中的连接查询与嵌套查询