刨根问底-修改源码之 设置springboot下quartz启动开关

之前有篇博客说到 应用集群(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();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_38316944/article/details/115003145