From 954953b04d6c54d02ee55bfe4377f17c6934d73d Mon Sep 17 00:00:00 2001 From: willdomkahari Date: Fri, 14 Jun 2024 11:44:08 +0200 Subject: [PATCH 1/4] Refactored to use constructor injection --- .../controller/EmailJobSchedulerController.java | 7 ++++--- .../java/com/example/quartzdemo/job/EmailJob.java | 14 +++++++------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/example/quartzdemo/controller/EmailJobSchedulerController.java b/src/main/java/com/example/quartzdemo/controller/EmailJobSchedulerController.java index 6b8c2e2..0853379 100644 --- a/src/main/java/com/example/quartzdemo/controller/EmailJobSchedulerController.java +++ b/src/main/java/com/example/quartzdemo/controller/EmailJobSchedulerController.java @@ -6,7 +6,6 @@ import org.quartz.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; @@ -21,9 +20,11 @@ @RestController public class EmailJobSchedulerController { private static final Logger logger = LoggerFactory.getLogger(EmailJobSchedulerController.class); + private final Scheduler scheduler; - @Autowired - private Scheduler scheduler; + public EmailJobSchedulerController(Scheduler scheduler) { + this.scheduler = scheduler; + } @PostMapping("/scheduleEmail") public ResponseEntity scheduleEmail(@Valid @RequestBody ScheduleEmailRequest scheduleEmailRequest) { diff --git a/src/main/java/com/example/quartzdemo/job/EmailJob.java b/src/main/java/com/example/quartzdemo/job/EmailJob.java index 1153bfa..e9c147d 100644 --- a/src/main/java/com/example/quartzdemo/job/EmailJob.java +++ b/src/main/java/com/example/quartzdemo/job/EmailJob.java @@ -2,10 +2,8 @@ import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.mail.MailProperties; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; @@ -20,14 +18,16 @@ public class EmailJob extends QuartzJobBean { private static final Logger logger = LoggerFactory.getLogger(EmailJob.class); - @Autowired - private JavaMailSender mailSender; + private final JavaMailSender mailSender; + private final MailProperties mailProperties; - @Autowired - private MailProperties mailProperties; + public EmailJob(JavaMailSender mailSender, MailProperties mailProperties) { + this.mailSender = mailSender; + this.mailProperties = mailProperties; + } @Override - protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { + protected void executeInternal(JobExecutionContext jobExecutionContext){ logger.info("Executing Job with key {}", jobExecutionContext.getJobDetail().getKey()); JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap(); From e08b378da3a9f60779e6bc316b34d0f3f7fe1684 Mon Sep 17 00:00:00 2001 From: willdomkahari Date: Fri, 14 Jun 2024 11:45:33 +0200 Subject: [PATCH 2/4] Automatically create database if it does not exist and automatically create quartz tables --- src/main/resources/application.properties | 11 +- src/main/resources/quartz_tables.sql | 179 ---------------------- 2 files changed, 7 insertions(+), 183 deletions(-) delete mode 100644 src/main/resources/quartz_tables.sql diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e8c1359..15bb246 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,10 @@ ## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) -spring.datasource.url = jdbc:mysql://localhost:3306/quartz_demo?useSSL=false +# Auto create database if it doesn't exist +spring.datasource.url = jdbc:mysql://localhost:3306/quartz_demo?createDatabaseIfNotExist=true +#spring.datasource.username = root +#spring.datasource.password = callicoder spring.datasource.username = root -spring.datasource.password = callicoder +spring.datasource.password = waduclay ## Hibernate Properties # The SQL dialect makes Hibernate generate better SQL for the chosen database @@ -11,14 +14,14 @@ spring.jpa.hibernate.ddl-auto = update ## QuartzProperties spring.quartz.job-store-type=jdbc -spring.quartz.jdbc.schema=classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql +spring.quartz.jdbc.initialize-schema=always spring.quartz.properties.org.quartz.threadPool.threadCount=5 ## MailProperties spring.mail.host=smtp.gmail.com spring.mail.port=587 spring.mail.username=rajeevc217@gmail.com -spring.mail.password= +spring.mail.password=zzz spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true diff --git a/src/main/resources/quartz_tables.sql b/src/main/resources/quartz_tables.sql deleted file mode 100644 index 8968c23..0000000 --- a/src/main/resources/quartz_tables.sql +++ /dev/null @@ -1,179 +0,0 @@ -# -# In your Quartz properties file, you'll need to set -# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate -# -# -# By: Ron Cordell - roncordell -# I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM. - -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_SIMPROP_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_CRON_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; - -CREATE TABLE QRTZ_JOB_DETAILS( -SCHED_NAME VARCHAR(120) NOT NULL, -JOB_NAME VARCHAR(190) NOT NULL, -JOB_GROUP VARCHAR(190) NOT NULL, -DESCRIPTION VARCHAR(250) NULL, -JOB_CLASS_NAME VARCHAR(250) NOT NULL, -IS_DURABLE VARCHAR(1) NOT NULL, -IS_NONCONCURRENT VARCHAR(1) NOT NULL, -IS_UPDATE_DATA VARCHAR(1) NOT NULL, -REQUESTS_RECOVERY VARCHAR(1) NOT NULL, -JOB_DATA BLOB NULL, -PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_TRIGGERS ( -SCHED_NAME VARCHAR(120) NOT NULL, -TRIGGER_NAME VARCHAR(190) NOT NULL, -TRIGGER_GROUP VARCHAR(190) NOT NULL, -JOB_NAME VARCHAR(190) NOT NULL, -JOB_GROUP VARCHAR(190) NOT NULL, -DESCRIPTION VARCHAR(250) NULL, -NEXT_FIRE_TIME BIGINT(13) NULL, -PREV_FIRE_TIME BIGINT(13) NULL, -PRIORITY INTEGER NULL, -TRIGGER_STATE VARCHAR(16) NOT NULL, -TRIGGER_TYPE VARCHAR(8) NOT NULL, -START_TIME BIGINT(13) NOT NULL, -END_TIME BIGINT(13) NULL, -CALENDAR_NAME VARCHAR(190) NULL, -MISFIRE_INSTR SMALLINT(2) NULL, -JOB_DATA BLOB 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)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_SIMPLE_TRIGGERS ( -SCHED_NAME VARCHAR(120) NOT NULL, -TRIGGER_NAME VARCHAR(190) NOT NULL, -TRIGGER_GROUP VARCHAR(190) NOT NULL, -REPEAT_COUNT BIGINT(7) NOT NULL, -REPEAT_INTERVAL BIGINT(12) NOT NULL, -TIMES_TRIGGERED BIGINT(10) 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)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_CRON_TRIGGERS ( -SCHED_NAME VARCHAR(120) NOT NULL, -TRIGGER_NAME VARCHAR(190) NOT NULL, -TRIGGER_GROUP VARCHAR(190) 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)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_SIMPROP_TRIGGERS - ( - SCHED_NAME VARCHAR(120) NOT NULL, - TRIGGER_NAME VARCHAR(190) NOT NULL, - TRIGGER_GROUP VARCHAR(190) 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 VARCHAR(1) NULL, - BOOL_PROP_2 VARCHAR(1) 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)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_BLOB_TRIGGERS ( -SCHED_NAME VARCHAR(120) NOT NULL, -TRIGGER_NAME VARCHAR(190) NOT NULL, -TRIGGER_GROUP VARCHAR(190) NOT NULL, -BLOB_DATA BLOB NULL, -PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), -INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP), -FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) -REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_CALENDARS ( -SCHED_NAME VARCHAR(120) NOT NULL, -CALENDAR_NAME VARCHAR(190) NOT NULL, -CALENDAR BLOB NOT NULL, -PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS ( -SCHED_NAME VARCHAR(120) NOT NULL, -TRIGGER_GROUP VARCHAR(190) NOT NULL, -PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_FIRED_TRIGGERS ( -SCHED_NAME VARCHAR(120) NOT NULL, -ENTRY_ID VARCHAR(95) NOT NULL, -TRIGGER_NAME VARCHAR(190) NOT NULL, -TRIGGER_GROUP VARCHAR(190) NOT NULL, -INSTANCE_NAME VARCHAR(190) NOT NULL, -FIRED_TIME BIGINT(13) NOT NULL, -SCHED_TIME BIGINT(13) NOT NULL, -PRIORITY INTEGER NOT NULL, -STATE VARCHAR(16) NOT NULL, -JOB_NAME VARCHAR(190) NULL, -JOB_GROUP VARCHAR(190) NULL, -IS_NONCONCURRENT VARCHAR(1) NULL, -REQUESTS_RECOVERY VARCHAR(1) NULL, -PRIMARY KEY (SCHED_NAME,ENTRY_ID)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_SCHEDULER_STATE ( -SCHED_NAME VARCHAR(120) NOT NULL, -INSTANCE_NAME VARCHAR(190) NOT NULL, -LAST_CHECKIN_TIME BIGINT(13) NOT NULL, -CHECKIN_INTERVAL BIGINT(13) NOT NULL, -PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_LOCKS ( -SCHED_NAME VARCHAR(120) NOT NULL, -LOCK_NAME VARCHAR(40) NOT NULL, -PRIMARY KEY (SCHED_NAME,LOCK_NAME)) -ENGINE=InnoDB; - -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; From e153c27f222822d0fcdbd9501a9dc65a89a20f37 Mon Sep 17 00:00:00 2001 From: willdomkahari Date: Fri, 14 Jun 2024 11:46:00 +0200 Subject: [PATCH 3/4] Edited documentation --- Readme.md | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/Readme.md b/Readme.md index 2347a91..d4a86e0 100644 --- a/Readme.md +++ b/Readme.md @@ -18,18 +18,12 @@ git clone https://github.com/callicoder/spring-boot-mysql-rest-api-tutorial.git ``` -**2. Create MySQL database** - -```bash -create database quartz_demo -``` - -**3. Change MySQL username and password as per your MySQL installation** +**2. Change MySQL username and password as per your MySQL installation** open `src/main/resources/application.properties`, and change `spring.datasource.username` and `spring.datasource.password` properties as per your mysql installation -**4. Setup Spring Mail** +**3. Setup Spring Mail** The project is using Gmail's SMTP server for sending emails. Whether you use Gmail or any other SMTP server, you'll need to configure the following mail properties accordingly - @@ -45,15 +39,8 @@ If you're using Gmail, you need to allow the third party apps to send emails by + Go to https://myaccount.google.com/security?pli=1#connectedapps + Set ‘Allow less secure apps’ to YES -**5. Create Quartz Tables** - -The project stores all the scheduled Jobs in MySQL database. You'll need to create the tables that Quartz uses to store Jobs and other job-related data. Please create Quartz specific tables by executing the `quartz_tables.sql` script located inside `src/main/resources` directory. - -```bash -mysql> source -``` -**6. Build and run the app using maven** +**4. Build and run the app using maven** Finally, You can run the app by typing the following command from the root directory of the project - From e6b3084a173ff55f1b26e2626c13d7b927fd7ba4 Mon Sep 17 00:00:00 2001 From: willdomkahari Date: Fri, 14 Jun 2024 12:05:33 +0200 Subject: [PATCH 4/4] Clean up credentials --- src/main/resources/application.properties | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 15bb246..05b7f15 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,10 +1,9 @@ ## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) # Auto create database if it doesn't exist spring.datasource.url = jdbc:mysql://localhost:3306/quartz_demo?createDatabaseIfNotExist=true -#spring.datasource.username = root -#spring.datasource.password = callicoder -spring.datasource.username = root -spring.datasource.password = waduclay +spring.datasource.username = +spring.datasource.password = + ## Hibernate Properties # The SQL dialect makes Hibernate generate better SQL for the chosen database @@ -18,10 +17,10 @@ spring.quartz.jdbc.initialize-schema=always spring.quartz.properties.org.quartz.threadPool.threadCount=5 ## MailProperties -spring.mail.host=smtp.gmail.com -spring.mail.port=587 -spring.mail.username=rajeevc217@gmail.com -spring.mail.password=zzz +spring.mail.host= +spring.mail.port= +spring.mail.username= +spring.mail.password= spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true