简体   繁体   English

Spring Boot Quartz 调度器配置

[英]Spring Boot Quartz Scheduler Configuration

I want to move our Quartz Scheduling configuration to our application.yml instead of maintaining a separate quartz.properties file.我想将我们的 Quartz 调度配置移动到我们的application.yml而不是维护一个单独的quartz.properties文件。

Our Spring Boot application runs and picks up the configuration as expected when using quartz.properties file, but it doesn't pick up the config from application.yml .我们的 Spring Boot 应用程序在使用quartz.properties文件时按预期运行并获取配置,但它不会从application.yml获取配置。

Scheduler bean:调度程序bean:

@SpringBootApplication
public class MyApp{
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }

    ...

    @Bean
    public Scheduler scheduler(SomeCustomConfig cfg, RestTemplate restTemplate) throws SchedulerException {
        //StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
        //schedulerFactory.initialize("quartz.properties");
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.getContext().put("restTemplate", restTemplate);
        scheduler.getContext().put("cfg", cfg);
        return scheduler;
    }

}

Pertinent application.yml :相关的application.yml

spring:
    application.name: myApp
    quartz:
        properties:
            org:
                quartz:
                    scheduler:
                        instanceId: AUTO
                    threadPool:
                        threadCount: 5
                    plugin:
                        shutdownhook:
                            class: org.quartz.plugins.management.ShutdownHookPlugin
                            cleanShutdown: TRUE
                    jobStore:
                        class: org.quartz.impl.jdbcjobstore.JobStoreTX
                        driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
                        tablePrefix: my_schema.
                        isClustered: true
                        dataSource: myDataSource
                    dataSource:
                        myDataSource:
                            driver: org.postgresql.Driver
                            URL: jdbc:postgresql://localhost/myDataSource
                            user: removed
                            password: removed

Our quartz.properties was:我们的quartz.properties是:

org.quartz.scheduler.instanceId = AUTO
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = TRUE
org.quartz.threadPool.threadCount = 5
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.tablePrefix = my_schema.
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.dataSource = myDataSource
org.quartz.dataSource.myDataSource.driver = org.postgresql.Driver
org.quartz.dataSource.myDataSource.URL = jdbc:postgresql://localhost/myDataSource
org.quartz.dataSource.myDataSource.user = removed
org.quartz.dataSource.myDataSource.password = removed

I feel like I'm missing something?我觉得我错过了什么?

Instead of代替

spring:
  quartz:
    properties:
      org:
        quartz:
          jobStore:
            isClustered: true

Use this layout:使用此布局:

spring:
  quartz:
    properties:
      org.quartz.jobStore:
        isClustered: true
      org.quartz.scheduler:
        instanceId: AUTO

With the latter layout, I get:使用后一种布局,我得到:

2019-09-06 13:45:19.919  INFO PID --- [           main] o.q.c.QuartzScheduler                    : {} Scheduler meta-data: Quartz Scheduler (v2.3.0) 'quartzScheduler' with instanceId '0157799997'
  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 10 threads.
  Using job-store 'org.springframework.scheduling.quartz.LocalDataSourceJobStore' - which supports persistence. and is clustered.

Your application.yml configuration sets for spring-boot-starter-quartz and I think you are using org.quartz-scheduler independently.您的application.yml配置为spring-boot-starter-quartz ,我认为您正在独立使用org.quartz-scheduler So you should config your application.yml something like this:所以你应该像这样配置你的application.yml

spring:
    application.name: myApp
org:
    quartz:
        scheduler:
            instanceId: AUTO
        threadPool:
            threadCount: 5
        plugin:
            shutdownhook:
                class: org.quartz.plugins.management.ShutdownHookPlugin
                cleanShutdown: TRUE
        jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
            tablePrefix: my_schema.
            isClustered: true
            dataSource: myDataSource
        dataSource:
            myDataSource:
                driver: org.postgresql.Driver
                URL: jdbc:postgresql://localhost/myDataSource
                user: removed
                password: removed

I have recently worked with Spring Boot Quartz Application and was facing a similar issue where the quartz.properties was not being detected by application where I was using application.yml to hold application environment variable我最近使用 Spring Boot Quartz Application 并面临类似的问题,即我使用 application.yml 保存应用程序环境变量的应用程序未检测到quartz.properties

spring:
 quartz:
  properties:
   org.quartz.scheduler:
    instanceName: ${QUARTZ_SCHEDULER_INSTANCE_NAME:Scheduler}
    instanceId: ${QUARTZ_SCHEDULER_INSTANCE_ID:AUTO}
    makeSchedulerThreadDaemon: ${QUARTZ_SCHEDULER_MAKE_THREAD_DAEMON:true}
   org.quartz.jobStore:
    class: ${QUARTZ_JOBSTORE_CLASS:org.quartz.impl.jdbcjobstore.JobStoreTX}
    driverDelegateClass: ${QUARTZ_JOBSTORE_DRIVER:org.quartz.impl.jdbcjobstore.PostgreSQLDelegate}
    tablePrefix: ${QUARTZ_JOBSTORE_TABLE_PREFIX:qrtz_}
    isClustered: ${QUARTZ_JOBSTORE_ISCLUSTER:false}
    dataSource: ${QUARTZ_JOBSTORE_DATASOURCE:myDS}
    misfireThreshold: ${QUARTZ_JOBSTORE_MISFIRE_THRESHOLD:25000}
   org.quartz.threadPool:
    class: ${QUARTZ_THREADPOOL_CLASS:org.quartz.simpl.SimpleThreadPool}
    makeThreadsDaemons: ${QUARTZ_THREADPOOL_DAEMON:true}
    threadCount: ${QUARTZ_THREADPOOL_COUNT:20}
    threadPriority: ${QUARTZ_THREADPOOL_PRIORITY:5}
  org.quartz.dataSource:
    myDS:
      driver: ${SPRING_DATASOURCE_DRIVER:org.postgresql.Driver}
      URL: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/postgres}
      user: ${SPRING_DATASOURCE_USERNAME:postgres}
      password: ${SPRING_DATASOURCE_PASSWORD:postgres}
      maxConnections: ${SPRING_DATASOURCE_MAX_CONNECTION:20}
      validationQuery: ${SPRING_DATASOURCE_VALIDATION_QUERY:select 1}

By using the above configuration in the above format, I was not only able to trigger Quartz jobs , i was also able to store in database通过以上述格式使用上述配置,我不仅能够触发 Quartz 作业,还能够存储在数据库中

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM