我们项目中的定时任务最开始小伙伴用的是springboot的定时任务,后面的小伙伴又用了若依集成的quartz,现在有需求就是开发环境不启动定时任务、测试和生产启用定时任务,这里给大家推荐一下我使用的方式
1、springboot控制定时任务启停
springboot控制定时任务启停首先需要对原有的@EnableScheduling进行改造,将原有的注解删除,新建一个SchedulingConfig类,在类中去读取是否开启定时任务来控制是否启用该配置文件
package com.yl.framework.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* 定时任务开关
* @author
*/
@Configuration
//启用定时任务
@EnableScheduling
//配置文件读取是否启用此配置
@ConditionalOnProperty(prefix = "scheduling", name = "enabled", havingValue = "true")
public class SchedulingConfig {
}
@ConditionalOnProperty注解是用来读取配置文件的,我们现在是开发环境关闭、正式环境和测试环境开启,开发环境yml中如下:
## 定时任务全局开关(开发环境)
scheduling:
enabled: false
测试环境和正式如下:
## 定时任务全局开关(正式、测试环境)
scheduling:
enabled: true
这样控制springboot定时任务启停就完成了,而对于若依集成的quartz,若依的作法其实是在项目启动时去进行一个初始化,我们只需要在初始化时根据我们yml中的配置来控制是否初始化就可以了,所有只需要修改SysJobServiceImpl类的init方法再重新启动项目就可以了
// 读取配置文件
@Value("${scheduling.enabled}")
private Boolean scheduleEnableFlg;
/**
* 项目启动时,初始化定时器 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改 数据库ID和任务组名,否则会导致脏数据)
*/
@PostConstruct
public void init() throws SchedulerException, TaskException
{
scheduler.clear();
if (scheduleEnableFlg) {
List<SysJob> jobList = jobMapper.selectJobAll();
for (SysJob job : jobList) {
updateSchedulerJob(job, job.getJobGroup());
}
log.info("定时任务已启动。");
} else {
log.info("定时任务未启动。");
}
}
到这里就大功告成了,我们只需要控制不同环境的yml里面的scheduling.enabled的值就可以根据环境来全局控制了,如果为true就开启,false就关闭,当然名字也可以随便起,这期的分享就到这了,有疑问的小伙伴欢迎留言评论,喜欢的小伙伴可以给点个赞