之前有篇博客说到 应用集群(2)-避免定时任务重复执行策略 ,现在记录一下做法吧。
众所周知,springBoot是自动装载的,只要你导入依赖,它就会运行,这很好,但又带来了麻烦
因为我们应用服务和定时任务服务是同一个项目,只是出厂的时候要分开部署,他们公用一个application.pro 和 一个quartz.pro文件,所以需要一个开关控制 quartz的启动
目前,当启动我们项目的时候,会自动蹦出这些quartz启动信息。
[INFO ] [2021-03-19 11:57:28,646] - Using default implementation for ThreadExecutor
[INFO ] [2021-03-19 11:57:28,649] - Job execution threads will use class loader of thread: main
[INFO ] [2021-03-19 11:57:28,662] - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
[INFO ] [2021-03-19 11:57:28,662] - Quartz Scheduler v.2.2.3 created.
[INFO ] [2021-03-19 11:57:28,663] - RAMJobStore initialized.
[INFO ] [2021-03-19 11:57:28,664] - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'ChengmengScheduler_172.16.133.67' with instanceId 'cb328a69-83dc-441b-bb03-78b6e8a240e1' Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 5 threads. Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
[INFO ] [2021-03-19 11:57:28,664] - Quartz scheduler 'LiemsScheduler_172.16.133.67">172.16.133.67' initialized from an externally provided properties instance.
[INFO ] [2021-03-19 11:57:28,664] - Quartz scheduler version: 2.2.3
[INFO ] [2021-03-19 11:57:28,665] - JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@5a4f7911
[INFO ] [2021-03-19 11:57:34,878] - Scheduler ChengmengScheduler_172.16.133.67_$_cb328a69-83dc-441b-bb03-78b6e8a240e1 started.
我们的设想是在quartz.pro中添加一个开关 quartz.isOpen,由开关控制quartz是否启用。
尝试1:
在QuartzConfigInit.java中配置SchedulerFactoryBean 的AutoStartup属性,失败了
@Configuration
public class QuartzConfigInit {
/** * SchedulerFactoryBean
* @return SchedulerFactoryBean
* @throws IOException
* @author chengmeng
* @createTime 2021-13-09 10:32:01 */
@Bean(name = "schedulerFactory")
public SchedulerFactoryBean SchedulerFactoryBean() throws IOException {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setAutoStartup(false);
return factory;
}
}
尝试二:
我觉得装在QuartzConfigInit 时候已经晚了,所以这次在application.pro中设置,还是没用
spring.quartz.auto-startup=false
尝试三:
修改源码,创建自定义的空的调度器,覆写工厂类,在获取调度器的方法里 根据 开关 进行判断处理,完美解决问题
//1.创建自定义的空调度器
public class ChengMengEmptyStdScheduler implements Scheduler{
}
//2.覆写StdSchedulerFactory类
public class StdSchedulerFactory implements SchedulerFactory {
//从application中读取quartz的开关,关闭则返回自定义的空调度器
if(!"true".equals(BeanUtils.getBean(Environment.class).getProperty("quartz.isOPen"))){
Log.warns("平台定时任务未开启[quartz.isOPen]");
return new LiemsEmptyStdScheduler();
}
}