springboot中如何做一个开关,启用和停用quartz

罗树鹏 发布于 2018/11/05 14:20
阅读 1K+
收藏 1

使用Spring Boot 2.x 做了一个后台管理系统,集成了Quartz功能,但有些工程需要用到定时任务,有些工程不会用到定时任务,有没有办法做一个设置,能够在用不到定时任务的工程中停用quartz,这样最起码不用创建quartz数据库,减少一定的施工难度

加载中
1
YYXX007
YYXX007

集成springcloud配置中心,修改配置可以实时生效

0
Kit_lee
Kit_lee

没搞过,但应该可以这样:你可以将Quartz的引用在pom.xml中的scope写成optional,然后自己实现一个autoconfigure,当发现当前工程有quartz的包时才对quartz的相关Bean进行声明

0
zy_3g
zy_3g

了解下@ConditionalOnProperty

罗树鹏
罗树鹏
回复 @zy_3g : 代码已经贴上来了,请赐教
zy_3g
zy_3g
回复 @罗树鹏 : 贴代码,配置文件,你这样子说没人知道什么问题的
罗树鹏
罗树鹏
这个知道,关键是不知道应该写在哪个地方 我已经QuartzConfig类上使用了,但好像没有起作用,quartz相关对象还是会启动
0
罗树鹏
罗树鹏
@Configuration
@EnableScheduling
@ConditionalOnProperty(value = "backsys.useQuartz", havingValue = "true", matchIfMissing = false)
public class QuartzConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.quartz")
    public QuartzProperties quartzProperties() {
        return  new QuartzProperties();
    }

    public HikariDataSource quzrtzDataSource() {
        HikariDataSource dataSource = new HikariDataSource();
        quartzProperties().config(dataSource);
        return dataSource;
    }

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setDataSource(quzrtzDataSource());
        // quartz参数
        Properties prop = new Properties();
        prop.put("org.quartz.scheduler.instanceName", "MyScheduler");
        prop.put("org.quartz.scheduler.instanceId", "AUTO");
        // 线程池配置
        prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
        prop.put("org.quartz.threadPool.threadCount", "20");
        prop.put("org.quartz.threadPool.threadPriority", "5");
        // JobStore配置
        prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
        // 集群配置
        prop.put("org.quartz.jobStore.isClustered", "true");
        prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
        prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");

        prop.put("org.quartz.jobStore.misfireThreshold", "12000");
        prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
        factory.setQuartzProperties(prop);

        factory.setSchedulerName("MyScheduler");
        // 延时启动
        factory.setStartupDelay(1);
        factory.setApplicationContextSchedulerContextKey("applicationContextKey");
        // 可选,QuartzScheduler
        // 启动时更新己存在的 Job,这样就不用每次修改 targetObject后删除 qrtz_job_details表对应记录了
        factory.setOverwriteExistingJobs(true);
        // 设置自动启动,默认为 true
        factory.setAutoStartup(true);

        return factory;
    }
}

 

0
凉茶未凉
凉茶未凉

@ConditionalOnProperty(value = "backsys.useQuartz", havingValue = "true", matchIfMissing = false)

value改成name试试

0
罗树鹏
罗树鹏

引用来自“凉茶未凉”的评论

@ConditionalOnProperty(value = "backsys.useQuartz", havingValue = "true", matchIfMissing = false)

value改成name试试

改成name也是不行的。

我猜想尽管quartzconfig类没有进行配置,但springboot自身有默认配置,所以走了默认配置的道路。

0
nian8
nian8

这个开关是如果是写在配置文件中,那修改一次就需要重启一次吧

0
小柒2012
小柒2012

早就有了:https://gitee.com/52itstyle/spring-boot-quartz

基于spring-boot+quartz的CRUD动态任务管理系统,适用于中小项目。

基于spring-boot 2.x +quartz 的CRUD任务管理系统:https://gitee.com/52itstyle/spring-boot-task

返回顶部
顶部