diff --git a/quartz-manager-parent/pom.xml b/quartz-manager-parent/pom.xml
index 71013e5..f6f2065 100644
--- a/quartz-manager-parent/pom.xml
+++ b/quartz-manager-parent/pom.xml
@@ -44,10 +44,17 @@
quartz-manager-starter-ui
quartz-manager-starter-security
quartz-manager-web-showcase
+ quartz-manager-starter-persistence
+ quartz-manager-common
+
+ it.fabioformosa.quartz-manager
+ quartz-manager-common
+ 3.0.2-SNAPSHOT
+
it.fabioformosa.quartz-manager
quartz-manager-starter-api
@@ -58,6 +65,11 @@
quartz-manager-starter-security
3.0.2-SNAPSHOT
+
+ it.fabioformosa.quartz-manager
+ quartz-manager-starter-persistence
+ 3.0.2-SNAPSHOT
+
it.fabioformosa.quartz-manager
quartz-manager-starter-ui
diff --git a/quartz-manager-parent/quartz-manager-common/pom.xml b/quartz-manager-parent/quartz-manager-common/pom.xml
new file mode 100644
index 0000000..cb1510d
--- /dev/null
+++ b/quartz-manager-parent/quartz-manager-common/pom.xml
@@ -0,0 +1,17 @@
+
+ 4.0.0
+
+ it.fabioformosa.quartz-manager
+ quartz-manager-parent
+ 3.0.2-SNAPSHOT
+
+ quartz-manager-common
+
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+
\ No newline at end of file
diff --git a/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/common/properties/QuartzModuleProperties.java b/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/common/properties/QuartzModuleProperties.java
new file mode 100644
index 0000000..9140b82
--- /dev/null
+++ b/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/common/properties/QuartzModuleProperties.java
@@ -0,0 +1,12 @@
+package it.fabioformosa.quartzmanager.common.properties;
+
+import java.util.Properties;
+
+import lombok.Data;
+
+@Data
+public class QuartzModuleProperties{
+
+ private Properties properties;
+
+}
diff --git a/quartz-manager-parent/quartz-manager-starter-api/pom.xml b/quartz-manager-parent/quartz-manager-starter-api/pom.xml
index a6af23e..70d57b2 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/pom.xml
+++ b/quartz-manager-parent/quartz-manager-starter-api/pom.xml
@@ -22,6 +22,10 @@
+
+ it.fabioformosa.quartz-manager
+ quartz-manager-common
+
org.springframework.boot
diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/configuration/SchedulerConfig.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/configuration/SchedulerConfig.java
index bbbb69e..3ce95d0 100644
--- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/configuration/SchedulerConfig.java
+++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/configuration/SchedulerConfig.java
@@ -8,6 +8,7 @@ import org.quartz.JobDetail;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.spi.JobFactory;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
@@ -21,6 +22,7 @@ import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
+import it.fabioformosa.quartzmanager.common.properties.QuartzModuleProperties;
import it.fabioformosa.quartzmanager.scheduler.AutowiringSpringBeanJobFactory;
import it.fabioformosa.quartzmanager.scheduler.TriggerMonitor;
import it.fabioformosa.quartzmanager.scheduler.TriggerMonitorImpl;
@@ -54,6 +56,9 @@ public class SchedulerConfig {
@Value("${quartz-manager.jobClass}")
private String jobClassname;
+ @Autowired(required = false)
+ private QuartzModuleProperties quartzModuleProperties;
+
@Bean(name = "triggerMonitor")
public TriggerMonitor createTriggerMonitor(@Qualifier("jobTrigger") Trigger trigger) {
TriggerMonitor triggerMonitor = new TriggerMonitorImpl();
@@ -94,7 +99,11 @@ public class SchedulerConfig {
@Qualifier("jobTrigger") Trigger sampleJobTrigger) throws IOException {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setJobFactory(jobFactory);
- factory.setQuartzProperties(quartzProperties());
+ Properties mergedProperties = new Properties();
+ mergedProperties.putAll(quartzProperties());
+ if(quartzModuleProperties != null)
+ mergedProperties.putAll(quartzModuleProperties.getProperties());
+ factory.setQuartzProperties(mergedProperties);
factory.setTriggers(sampleJobTrigger);
factory.setAutoStartup(false);
return factory;
diff --git a/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml b/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml
new file mode 100644
index 0000000..4b25241
--- /dev/null
+++ b/quartz-manager-parent/quartz-manager-starter-persistence/pom.xml
@@ -0,0 +1,47 @@
+
+ 4.0.0
+
+ it.fabioformosa.quartz-manager
+ quartz-manager-parent
+ 3.0.2-SNAPSHOT
+
+
+ quartz-manager-starter-persistence
+
+ Quartz Manager Starter Security
+ Persist quartz jobs into a database
+
+ https://github.com/fabioformosa/quartz-manager
+
+ ${basedir}/../..
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ it.fabioformosa.quartz-manager
+ quartz-manager-common
+
+
+ org.liquibase
+ liquibase-core
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+
+
\ No newline at end of file
diff --git a/quartz-manager-parent/quartz-manager-starter-persistence/src/main/java/it/fabioformosa/quartzmanager/persistence/PersistenceConfig.java b/quartz-manager-parent/quartz-manager-starter-persistence/src/main/java/it/fabioformosa/quartzmanager/persistence/PersistenceConfig.java
new file mode 100644
index 0000000..8690183
--- /dev/null
+++ b/quartz-manager-parent/quartz-manager-starter-persistence/src/main/java/it/fabioformosa/quartzmanager/persistence/PersistenceConfig.java
@@ -0,0 +1,69 @@
+package it.fabioformosa.quartzmanager.persistence;
+
+import javax.sql.DataSource;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.PropertySource;
+
+import it.fabioformosa.quartzmanager.common.properties.QuartzModuleProperties;
+import liquibase.integration.spring.SpringLiquibase;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Configuration
+@PropertySource("classpath:quartz-manager-application-persistence.properties")
+public class PersistenceConfig {
+
+ @Data
+ public class PersistenceDatasourceProps {
+ private String url;
+ private String changeLog;
+ private String contexts;
+ private String user;
+ private String password;
+ }
+
+ // @Data
+ // public class QuartzModuleProperties{
+ // private Properties properties;
+ // }
+
+ @Bean
+ public SpringLiquibase liquibase(PersistenceDatasourceProps persistenceDatasourceProps, DataSource quartzManagerDatasource) {
+ SpringLiquibase liquibase = new SpringLiquibase();
+ liquibase.setContexts(persistenceDatasourceProps.getContexts());
+ liquibase.setChangeLog(persistenceDatasourceProps.getChangeLog());
+ liquibase.setDataSource(quartzManagerDatasource);
+ liquibase.setDropFirst(false);
+ return liquibase;
+ }
+
+ @Bean
+ @ConfigurationProperties(prefix = "spring.liquibase")
+ public PersistenceDatasourceProps persistenceDatasourceProps() {
+ return new PersistenceDatasourceProps();
+ }
+
+ @Bean("quartzPersistenceProperties")
+ @ConfigurationProperties(prefix = "spring.quartz")
+ public QuartzModuleProperties persistenceQuartzProps() {
+ return new QuartzModuleProperties();
+ }
+
+ @Primary
+ @Bean
+ public DataSource quartzManagerDatasource(PersistenceDatasourceProps persistenceDatasourceProps) {
+ return DataSourceBuilder.create()
+ .url(persistenceDatasourceProps.getUrl())
+ .driverClassName("org.postgresql.Driver")
+ .username(persistenceDatasourceProps.getUser())
+ .password(persistenceDatasourceProps.getPassword())
+ .build();
+ }
+
+}
diff --git a/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/META-INF/spring.factories b/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000..772bc91
--- /dev/null
+++ b/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+it.fabioformosa.quartzmanager.persistence.PersistenceConfig
\ No newline at end of file
diff --git a/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/db/quartz-scheduler/liquibase-changelog-master.xml b/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/db/quartz-scheduler/liquibase-changelog-master.xml
new file mode 100644
index 0000000..ad7fc84
--- /dev/null
+++ b/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/db/quartz-scheduler/liquibase-changelog-master.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
diff --git a/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/db/quartz-scheduler/migrations/V202102190034_quartz_tables_postgresql.sql b/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/db/quartz-scheduler/migrations/V202102190034_quartz_tables_postgresql.sql
new file mode 100644
index 0000000..1fc9754
--- /dev/null
+++ b/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/db/quartz-scheduler/migrations/V202102190034_quartz_tables_postgresql.sql
@@ -0,0 +1,218 @@
+--liquibase formatted sql
+
+/* https://github.com/quartz-scheduler/quartz/blob/master/quartz-core/src/main/resources/org/quartz/impl/jdbcjobstore/tables_postgres.sql */
+
+--changeset V202102190034_01 (dbms:postgresql)
+DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
+DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
+DROP TABLE IF EXISTS QRTZ_LOCKS;
+DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
+DROP TABLE IF EXISTS QRTZ_CALENDARS;
+
+--changeset V202102190034_02 (dbms:postgresql)
+CREATE TABLE QRTZ_JOB_DETAILS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ JOB_NAME VARCHAR(200) NOT NULL,
+ JOB_GROUP VARCHAR(200) NOT NULL,
+ DESCRIPTION VARCHAR(250) NULL,
+ JOB_CLASS_NAME VARCHAR(250) NOT NULL,
+ IS_DURABLE BOOL NOT NULL,
+ IS_NONCONCURRENT BOOL NOT NULL,
+ IS_UPDATE_DATA BOOL NOT NULL,
+ REQUESTS_RECOVERY BOOL NOT NULL,
+ JOB_DATA BYTEA NULL,
+ PRIMARY KEY (SCHED_NAME, JOB_NAME, JOB_GROUP)
+);
+
+--changeset V202102190034_03 (dbms:postgresql)
+CREATE TABLE QRTZ_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ JOB_NAME VARCHAR(200) NOT NULL,
+ JOB_GROUP VARCHAR(200) NOT NULL,
+ DESCRIPTION VARCHAR(250) NULL,
+ NEXT_FIRE_TIME BIGINT NULL,
+ PREV_FIRE_TIME BIGINT NULL,
+ PRIORITY INTEGER NULL,
+ TRIGGER_STATE VARCHAR(16) NOT NULL,
+ TRIGGER_TYPE VARCHAR(8) NOT NULL,
+ START_TIME BIGINT NOT NULL,
+ END_TIME BIGINT NULL,
+ CALENDAR_NAME VARCHAR(200) NULL,
+ MISFIRE_INSTR SMALLINT NULL,
+ JOB_DATA BYTEA NULL,
+ PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
+ FOREIGN KEY (SCHED_NAME, JOB_NAME, JOB_GROUP)
+ REFERENCES QRTZ_JOB_DETAILS (SCHED_NAME, JOB_NAME, JOB_GROUP)
+);
+
+--changeset V202102190034_04 (dbms:postgresql)
+CREATE TABLE QRTZ_SIMPLE_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ REPEAT_COUNT BIGINT NOT NULL,
+ REPEAT_INTERVAL BIGINT NOT NULL,
+ TIMES_TRIGGERED BIGINT NOT NULL,
+ PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
+ FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+ REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+);
+
+--changeset V202102190034_05 (dbms:postgresql)
+CREATE TABLE QRTZ_CRON_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ CRON_EXPRESSION VARCHAR(120) NOT NULL,
+ TIME_ZONE_ID VARCHAR(80),
+ PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
+ FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+ REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+);
+
+--changeset V202102190034_06 (dbms:postgresql)
+CREATE TABLE QRTZ_SIMPROP_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ STR_PROP_1 VARCHAR(512) NULL,
+ STR_PROP_2 VARCHAR(512) NULL,
+ STR_PROP_3 VARCHAR(512) NULL,
+ INT_PROP_1 INT NULL,
+ INT_PROP_2 INT NULL,
+ LONG_PROP_1 BIGINT NULL,
+ LONG_PROP_2 BIGINT NULL,
+ DEC_PROP_1 NUMERIC(13, 4) NULL,
+ DEC_PROP_2 NUMERIC(13, 4) NULL,
+ BOOL_PROP_1 BOOL NULL,
+ BOOL_PROP_2 BOOL NULL,
+ PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
+ FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+ REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+);
+
+--changeset V202102190034_07 (dbms:postgresql)
+CREATE TABLE QRTZ_BLOB_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ BLOB_DATA BYTEA NULL,
+ PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
+ FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+ REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+);
+
+--changeset V202102190034_08 (dbms:postgresql)
+CREATE TABLE QRTZ_CALENDARS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ CALENDAR_NAME VARCHAR(200) NOT NULL,
+ CALENDAR BYTEA NOT NULL,
+ PRIMARY KEY (SCHED_NAME, CALENDAR_NAME)
+);
+
+--changeset V202102190034_09 (dbms:postgresql)
+CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ PRIMARY KEY (SCHED_NAME, TRIGGER_GROUP)
+);
+
+--changeset V202102190034_10 (dbms:postgresql)
+CREATE TABLE QRTZ_FIRED_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ ENTRY_ID VARCHAR(95) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ INSTANCE_NAME VARCHAR(200) NOT NULL,
+ FIRED_TIME BIGINT NOT NULL,
+ SCHED_TIME BIGINT NOT NULL,
+ PRIORITY INTEGER NOT NULL,
+ STATE VARCHAR(16) NOT NULL,
+ JOB_NAME VARCHAR(200) NULL,
+ JOB_GROUP VARCHAR(200) NULL,
+ IS_NONCONCURRENT BOOL NULL,
+ REQUESTS_RECOVERY BOOL NULL,
+ PRIMARY KEY (SCHED_NAME, ENTRY_ID)
+);
+
+--changeset V202102190034_11 (dbms:postgresql)
+CREATE TABLE QRTZ_SCHEDULER_STATE
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ INSTANCE_NAME VARCHAR(200) NOT NULL,
+ LAST_CHECKIN_TIME BIGINT NOT NULL,
+ CHECKIN_INTERVAL BIGINT NOT NULL,
+ PRIMARY KEY (SCHED_NAME, INSTANCE_NAME)
+);
+
+--changeset V202102190034_12 (dbms:postgresql)
+CREATE TABLE QRTZ_LOCKS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ LOCK_NAME VARCHAR(40) NOT NULL,
+ PRIMARY KEY (SCHED_NAME, LOCK_NAME)
+);
+
+--changeset V202102190034_13 (dbms:postgresql)
+CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY
+ ON QRTZ_JOB_DETAILS (SCHED_NAME, REQUESTS_RECOVERY);
+CREATE INDEX IDX_QRTZ_J_GRP
+ ON QRTZ_JOB_DETAILS (SCHED_NAME, JOB_GROUP);
+
+CREATE INDEX IDX_QRTZ_T_J
+ ON QRTZ_TRIGGERS (SCHED_NAME, JOB_NAME, JOB_GROUP);
+CREATE INDEX IDX_QRTZ_T_JG
+ ON QRTZ_TRIGGERS (SCHED_NAME, JOB_GROUP);
+CREATE INDEX IDX_QRTZ_T_C
+ ON QRTZ_TRIGGERS (SCHED_NAME, CALENDAR_NAME);
+CREATE INDEX IDX_QRTZ_T_G
+ ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_GROUP);
+CREATE INDEX IDX_QRTZ_T_STATE
+ ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_STATE);
+CREATE INDEX IDX_QRTZ_T_N_STATE
+ ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, TRIGGER_STATE);
+CREATE INDEX IDX_QRTZ_T_N_G_STATE
+ ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_GROUP, TRIGGER_STATE);
+CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME
+ ON QRTZ_TRIGGERS (SCHED_NAME, NEXT_FIRE_TIME);
+CREATE INDEX IDX_QRTZ_T_NFT_ST
+ ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_STATE, NEXT_FIRE_TIME);
+CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE
+ ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME);
+CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE
+ ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_STATE);
+CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP
+ ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_GROUP, TRIGGER_STATE);
+
+CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME
+ ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, INSTANCE_NAME);
+CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY
+ ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, INSTANCE_NAME, REQUESTS_RECOVERY);
+CREATE INDEX IDX_QRTZ_FT_J_G
+ ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, JOB_NAME, JOB_GROUP);
+CREATE INDEX IDX_QRTZ_FT_JG
+ ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, JOB_GROUP);
+CREATE INDEX IDX_QRTZ_FT_T_G
+ ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);
+CREATE INDEX IDX_QRTZ_FT_TG
+ ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, TRIGGER_GROUP);
+
+
+COMMIT;
diff --git a/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/quartz-manager-application-persistence.properties b/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/quartz-manager-application-persistence.properties
new file mode 100644
index 0000000..9edbfcf
--- /dev/null
+++ b/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/quartz-manager-application-persistence.properties
@@ -0,0 +1,20 @@
+spring.liquibase.url=jdbc:postgresql://localhost:5432/quartzmanager
+spring.liquibase.change-log=classpath:db/quartz-scheduler/liquibase-changelog-master.xml
+spring.liquibase.contexts=default
+spring.liquibase.user=quartzmanager
+spring.liquibase.password=quartzmanager
+spring.quartz.job-store-type=jdbc
+spring.quartz.initialize-schema=never
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
+spring.quartz.properties.org.quartz.dataSource.quartzDataSource.driver=org.postgresql.Driver
+spring.quartz.properties.org.quartz.dataSource.quartzDataSource.URL=jdbc:postgresql://localhost:5432/quartzmanager
+spring.quartz.properties.org.quartz.dataSource.quartzDataSource.user=quartzmanager
+spring.quartz.properties.org.quartz.dataSource.quartzDataSource.password=quartzmanager
+spring.quartz.properties.org.quartz.dataSource.quartzDataSource.maxConnections=5
+spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
+spring.quartz.properties.org.quartz.jobStore.dataSource=quartzDataSource
+spring.quartz.properties.org.quartz.dataSource.quartzDataSource.provider=hikaricp
+spring.quartz.properties.org.quartz.jobStore.misfireThreshold=1000
+# org.quartz.jobStore.isClustered=true
+# org.quartz.scheduler.instanceId=AUTO
\ No newline at end of file
diff --git a/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/quartz-persistence.properties b/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/quartz-persistence.properties
new file mode 100644
index 0000000..3e68aac
--- /dev/null
+++ b/quartz-manager-parent/quartz-manager-starter-persistence/src/main/resources/quartz-persistence.properties
@@ -0,0 +1,10 @@
+org.quartz.dataSource.quartzDataSource.driver = org.postgresql.Driver
+org.quartz.dataSource.quartzDataSource.URL = jdbc:postgresql://localhost:5432/quartzmanager
+org.quartz.dataSource.quartzDataSource.user quartzmanager
+org.quartz.dataSource.quartzDataSource.password = quartzmanager
+org.quartz.dataSource.quartzDataSource.maxConnections = 5
+org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
+org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
+org.quartz.jobStore.dataSource = quartzDataSource
+org.quartz.dataSource.quartzDataSource.provider=hikaricp
+org.quartz.jobStore.misfireThreshold=1000
\ No newline at end of file
diff --git a/quartz-manager-parent/quartz-manager-web-showcase/pom.xml b/quartz-manager-parent/quartz-manager-web-showcase/pom.xml
index c347758..e4787b0 100644
--- a/quartz-manager-parent/quartz-manager-web-showcase/pom.xml
+++ b/quartz-manager-parent/quartz-manager-web-showcase/pom.xml
@@ -35,6 +35,10 @@
it.fabioformosa.quartz-manager
quartz-manager-starter-security
+
+ it.fabioformosa.quartz-manager
+ quartz-manager-starter-persistence
+
@@ -110,6 +114,18 @@
org.apache.commons
commons-lang3
+
+
+
+ org.liquibase
+ liquibase-core
+
+
+
+ org.postgresql
+ postgresql
+
+
diff --git a/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/application.yml b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/application.yml
index c2115fa..5d2e4ab 100644
--- a/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/application.yml
+++ b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/application.yml
@@ -12,6 +12,24 @@ spring:
cache: false
mode: LEGACYHTML5
jpa.open-in-view: false
+# liquibase:
+# change-log: "classpath:db/liquibase-changelog-master.xml"
+# contexts: default
+# user: quartzmanager
+# password: quartzmanager
+# datasource:
+# url: "jdbc:postgresql://localhost:5432/quartzmanager"
+# username: quartzmanager
+# password: quartzmanager
+
+# quartz:
+# job-store-type: jdbc
+# initialize-schema: never
+# properties:
+# org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
+
+# org.quartz.jobStore.isClustered: true
+# org.quartz.scheduler.instanceId=AUTO
quartz:
enabled: true
@@ -26,6 +44,7 @@ logging:
org.springframework.security: INFO
org.springframework.boot.autoconfigure.security: INFO
it.fabioformosa: DEBUG
+ org.quartz: DEBUG
quartz-manager:
security:
diff --git a/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/db/liquibase-changelog-master.xml b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/db/liquibase-changelog-master.xml
new file mode 100644
index 0000000..ad7fc84
--- /dev/null
+++ b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/db/liquibase-changelog-master.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
diff --git a/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/db/migrations/V202102190034_quartz_tables.sql b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/db/migrations/V202102190034_quartz_tables.sql
new file mode 100644
index 0000000..1fc9754
--- /dev/null
+++ b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/db/migrations/V202102190034_quartz_tables.sql
@@ -0,0 +1,218 @@
+--liquibase formatted sql
+
+/* https://github.com/quartz-scheduler/quartz/blob/master/quartz-core/src/main/resources/org/quartz/impl/jdbcjobstore/tables_postgres.sql */
+
+--changeset V202102190034_01 (dbms:postgresql)
+DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
+DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
+DROP TABLE IF EXISTS QRTZ_LOCKS;
+DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_TRIGGERS;
+DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
+DROP TABLE IF EXISTS QRTZ_CALENDARS;
+
+--changeset V202102190034_02 (dbms:postgresql)
+CREATE TABLE QRTZ_JOB_DETAILS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ JOB_NAME VARCHAR(200) NOT NULL,
+ JOB_GROUP VARCHAR(200) NOT NULL,
+ DESCRIPTION VARCHAR(250) NULL,
+ JOB_CLASS_NAME VARCHAR(250) NOT NULL,
+ IS_DURABLE BOOL NOT NULL,
+ IS_NONCONCURRENT BOOL NOT NULL,
+ IS_UPDATE_DATA BOOL NOT NULL,
+ REQUESTS_RECOVERY BOOL NOT NULL,
+ JOB_DATA BYTEA NULL,
+ PRIMARY KEY (SCHED_NAME, JOB_NAME, JOB_GROUP)
+);
+
+--changeset V202102190034_03 (dbms:postgresql)
+CREATE TABLE QRTZ_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ JOB_NAME VARCHAR(200) NOT NULL,
+ JOB_GROUP VARCHAR(200) NOT NULL,
+ DESCRIPTION VARCHAR(250) NULL,
+ NEXT_FIRE_TIME BIGINT NULL,
+ PREV_FIRE_TIME BIGINT NULL,
+ PRIORITY INTEGER NULL,
+ TRIGGER_STATE VARCHAR(16) NOT NULL,
+ TRIGGER_TYPE VARCHAR(8) NOT NULL,
+ START_TIME BIGINT NOT NULL,
+ END_TIME BIGINT NULL,
+ CALENDAR_NAME VARCHAR(200) NULL,
+ MISFIRE_INSTR SMALLINT NULL,
+ JOB_DATA BYTEA NULL,
+ PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
+ FOREIGN KEY (SCHED_NAME, JOB_NAME, JOB_GROUP)
+ REFERENCES QRTZ_JOB_DETAILS (SCHED_NAME, JOB_NAME, JOB_GROUP)
+);
+
+--changeset V202102190034_04 (dbms:postgresql)
+CREATE TABLE QRTZ_SIMPLE_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ REPEAT_COUNT BIGINT NOT NULL,
+ REPEAT_INTERVAL BIGINT NOT NULL,
+ TIMES_TRIGGERED BIGINT NOT NULL,
+ PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
+ FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+ REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+);
+
+--changeset V202102190034_05 (dbms:postgresql)
+CREATE TABLE QRTZ_CRON_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ CRON_EXPRESSION VARCHAR(120) NOT NULL,
+ TIME_ZONE_ID VARCHAR(80),
+ PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
+ FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+ REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+);
+
+--changeset V202102190034_06 (dbms:postgresql)
+CREATE TABLE QRTZ_SIMPROP_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ STR_PROP_1 VARCHAR(512) NULL,
+ STR_PROP_2 VARCHAR(512) NULL,
+ STR_PROP_3 VARCHAR(512) NULL,
+ INT_PROP_1 INT NULL,
+ INT_PROP_2 INT NULL,
+ LONG_PROP_1 BIGINT NULL,
+ LONG_PROP_2 BIGINT NULL,
+ DEC_PROP_1 NUMERIC(13, 4) NULL,
+ DEC_PROP_2 NUMERIC(13, 4) NULL,
+ BOOL_PROP_1 BOOL NULL,
+ BOOL_PROP_2 BOOL NULL,
+ PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
+ FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+ REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+);
+
+--changeset V202102190034_07 (dbms:postgresql)
+CREATE TABLE QRTZ_BLOB_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ BLOB_DATA BYTEA NULL,
+ PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
+ FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+ REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
+);
+
+--changeset V202102190034_08 (dbms:postgresql)
+CREATE TABLE QRTZ_CALENDARS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ CALENDAR_NAME VARCHAR(200) NOT NULL,
+ CALENDAR BYTEA NOT NULL,
+ PRIMARY KEY (SCHED_NAME, CALENDAR_NAME)
+);
+
+--changeset V202102190034_09 (dbms:postgresql)
+CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ PRIMARY KEY (SCHED_NAME, TRIGGER_GROUP)
+);
+
+--changeset V202102190034_10 (dbms:postgresql)
+CREATE TABLE QRTZ_FIRED_TRIGGERS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ ENTRY_ID VARCHAR(95) NOT NULL,
+ TRIGGER_NAME VARCHAR(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) NOT NULL,
+ INSTANCE_NAME VARCHAR(200) NOT NULL,
+ FIRED_TIME BIGINT NOT NULL,
+ SCHED_TIME BIGINT NOT NULL,
+ PRIORITY INTEGER NOT NULL,
+ STATE VARCHAR(16) NOT NULL,
+ JOB_NAME VARCHAR(200) NULL,
+ JOB_GROUP VARCHAR(200) NULL,
+ IS_NONCONCURRENT BOOL NULL,
+ REQUESTS_RECOVERY BOOL NULL,
+ PRIMARY KEY (SCHED_NAME, ENTRY_ID)
+);
+
+--changeset V202102190034_11 (dbms:postgresql)
+CREATE TABLE QRTZ_SCHEDULER_STATE
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ INSTANCE_NAME VARCHAR(200) NOT NULL,
+ LAST_CHECKIN_TIME BIGINT NOT NULL,
+ CHECKIN_INTERVAL BIGINT NOT NULL,
+ PRIMARY KEY (SCHED_NAME, INSTANCE_NAME)
+);
+
+--changeset V202102190034_12 (dbms:postgresql)
+CREATE TABLE QRTZ_LOCKS
+(
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ LOCK_NAME VARCHAR(40) NOT NULL,
+ PRIMARY KEY (SCHED_NAME, LOCK_NAME)
+);
+
+--changeset V202102190034_13 (dbms:postgresql)
+CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY
+ ON QRTZ_JOB_DETAILS (SCHED_NAME, REQUESTS_RECOVERY);
+CREATE INDEX IDX_QRTZ_J_GRP
+ ON QRTZ_JOB_DETAILS (SCHED_NAME, JOB_GROUP);
+
+CREATE INDEX IDX_QRTZ_T_J
+ ON QRTZ_TRIGGERS (SCHED_NAME, JOB_NAME, JOB_GROUP);
+CREATE INDEX IDX_QRTZ_T_JG
+ ON QRTZ_TRIGGERS (SCHED_NAME, JOB_GROUP);
+CREATE INDEX IDX_QRTZ_T_C
+ ON QRTZ_TRIGGERS (SCHED_NAME, CALENDAR_NAME);
+CREATE INDEX IDX_QRTZ_T_G
+ ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_GROUP);
+CREATE INDEX IDX_QRTZ_T_STATE
+ ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_STATE);
+CREATE INDEX IDX_QRTZ_T_N_STATE
+ ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, TRIGGER_STATE);
+CREATE INDEX IDX_QRTZ_T_N_G_STATE
+ ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_GROUP, TRIGGER_STATE);
+CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME
+ ON QRTZ_TRIGGERS (SCHED_NAME, NEXT_FIRE_TIME);
+CREATE INDEX IDX_QRTZ_T_NFT_ST
+ ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_STATE, NEXT_FIRE_TIME);
+CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE
+ ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME);
+CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE
+ ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_STATE);
+CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP
+ ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_GROUP, TRIGGER_STATE);
+
+CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME
+ ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, INSTANCE_NAME);
+CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY
+ ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, INSTANCE_NAME, REQUESTS_RECOVERY);
+CREATE INDEX IDX_QRTZ_FT_J_G
+ ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, JOB_NAME, JOB_GROUP);
+CREATE INDEX IDX_QRTZ_FT_JG
+ ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, JOB_GROUP);
+CREATE INDEX IDX_QRTZ_FT_T_G
+ ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);
+CREATE INDEX IDX_QRTZ_FT_TG
+ ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, TRIGGER_GROUP);
+
+
+COMMIT;
diff --git a/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/logback.xml b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/logback.xml
index 90577b1..413c274 100644
--- a/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/logback.xml
+++ b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/logback.xml
@@ -19,7 +19,7 @@
-
+
diff --git a/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/quartz.properties b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/quartz.properties
index bf7cc50..44b1da1 100644
--- a/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/quartz.properties
+++ b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/quartz.properties
@@ -1,3 +1,13 @@
org.quartz.scheduler.instanceName=example
org.quartz.scheduler.instanceId=AUTO
-org.quartz.threadPool.threadCount=1
\ No newline at end of file
+org.quartz.threadPool.threadCount=1
+#org.quartz.dataSource.quartzDataSource.driver = org.postgresql.Driver
+#org.quartz.dataSource.quartzDataSource.URL = jdbc:postgresql://localhost:5432/quartzmanager
+#org.quartz.dataSource.quartzDataSource.user quartzmanager
+#org.quartz.dataSource.quartzDataSource.password = quartzmanager
+#org.quartz.dataSource.quartzDataSource.maxConnections = 5
+#org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
+#org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
+#org.quartz.jobStore.dataSource = quartzDataSource
+#org.quartz.dataSource.quartzDataSource.provider=hikaricp
+#org.quartz.jobStore.misfireThreshold=1000
\ No newline at end of file