Как сохранить рабочие места в базе данных H2 из проекта Spring - PullRequest
1 голос
/ 04 ноября 2019

Как сохранить задания Quartz в файловой базе данных H2 из проекта Spring?

У меня есть приложение Spring, которое планирует задания с использованием Quartz. Это работает, но я теряю все работы, когда приложение закрывается. Я хотел бы сохранить эти задания в базе данных H2 (в локальном файле). Мой проект построен с Gradle. Я прочитал много примеров, построенных с использованием более старых версий различных библиотек, но либо я не могу заставить их работать, либо я не могу воспроизвести их в моем тестовом проекте. Я прочитал некоторые документы, которые показались мне полезными, и перепробовал множество различных настроек в application.properties, но мое приложение по-прежнему запускается с использованием значения по умолчанию в хранилище заданий памяти.

Среди множества других вещей, которые я рассмотрел:

http://www.quartz -scheduler.org / документация / quartz-2.1.7 / configuration / ConfigJobStoreTX.html

http://www.quartz -scheduler.org/documentation/quartz-2.1.7/configuration/ConfigDataSources.html

https://dzone.com/articles/mule-quartz-connector-how-to-use-jdbc-jobstore-ins

https://www.candlepinproject.org/docs/candlepin/quartz_setup.html

application.properties

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate

spring.datasource.driver-class-name=org.h2.Driver  
spring.datasource.url=jdbc:h2:file:~/testqrtz  
spring.datasource.username=admin   
spring.datasource.password=admin  
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect  

spring.h2.console.enabled=true  
spring.h2.console.path=/h2  

build.gradle

plugins {
    id 'org.springframework.boot' version '2.2.0.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {  
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'  
    implementation 'org.springframework.boot:spring-boot-starter-quartz'  
    implementation 'org.springframework.boot:spring-boot-starter-web'  
    runtimeOnly 'com.h2database:h2'  
}

Что происходит, когда я запускаю этот проект

Триггеры не сохраняются. Кварцевые столы не создаются. Проект продолжает использовать хранилище заданий по умолчанию. Это сообщение отображается при загрузке:

Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

1 Ответ

0 голосов
/ 04 ноября 2019

Я думаю, что вопрос в том, почему кварц использует RAMJobStore, несмотря на тот факт, что OP показывает, что хранилище JDBC было настроено.

Я думаю, что ответ заключается в неправильной интеграции пружины, выполненной с кварцемв этом проекте.

Очевидно, что кварц "как-то" запускается с конфигурацией по умолчанию (которая среди прочего использует RAMJobStore).

application.properties, где все свойства определены, звучит какФайл конфигурации весенней загрузки, а не файл кварца (обычно называется quartz.properties).

Обычно вам нужно определить bean-компонент планировщика и указать, откуда именно вы хотите прочитать конфигурацию:

@Bean
public SchedulerFactoryBean scheduler(Trigger trigger, JobDetail job, DataSource 
   quartzDataSource) {
     SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
     schedulerFactory.setConfigLocation(new ClassPathResource("quartz.properties"));
     ...
     schedulerFactory.setJobDetails(job);
     schedulerFactory.setTriggers(trigger);
     schedulerFactory.setDataSource(quartzDataSource);
     return schedulerFactory;
}

Это одна из возможных причин того, что может пойти не так, Здесь , пожалуйста, найдите более подробную информацию и в целом проверьте интеграцию пружины с кварцем.

...