背景
springBoot2.x中集成了quartz的自动配置类(QuartzAutoConfiguration),但是springBoot提供的配置属性中并没有提供overwriteExistingJobs这个属性的设置。
导致的问题
假如我们使用quartz自带的数据库对任务进行了持久化且系统并没有提供对任务的界面化操作。当我们需要对任务进行修改时,更改了代码或者配置文件中的信息,如参数、corn表达式等,会发现新的表达式并没有生效(原因是我们没有设置overwriteExistingJobs参数)
解决方案
在quartz自动初始化之后,我们获取SchedulerFactory,设置overwriteExistingJobs参数,然后获得Scheduler,通过Scheduler重新设置所有Trigger.
代码实现
package com.koolyun.eas.account.scheduler.config;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import javax.annotation.PostConstruct;
import java.util.List;
/**
* @author bozheng
* @date 2018/10/10 15:48
*/
@Configuration
@AutoConfigureAfter(QuartzAutoConfiguration.class)
public class QuartzSupportConfig{
@Autowired(required = false)
private List<Trigger> triggers ;
@Autowired
SchedulerFactoryBean schedulerFactoryBean;
@PostConstruct
public void quartzScheduler() throws SchedulerException {
schedulerFactoryBean.setOverwriteExistingJobs(true);
if (triggers != null){
Scheduler scheduler = schedulerFactoryBean.getScheduler();
for (Trigger trigger : triggers){
scheduler.rescheduleJob(trigger.getKey(),trigger);
}
}
}
}