diff --git a/src/main/java/com/lawtk/lawtkschedulerbe/controller/JobController.java b/src/main/java/com/lawtk/lawtkschedulerbe/controller/JobController.java index 728ff8f8138ee6400ad3420572b79adf77b7d6b4..180afec07dcc84645d05612f27d1dedd8e7061c2 100644 --- a/src/main/java/com/lawtk/lawtkschedulerbe/controller/JobController.java +++ b/src/main/java/com/lawtk/lawtkschedulerbe/controller/JobController.java @@ -11,7 +11,7 @@ import java.util.List; @Slf4j @RestController -@RequestMapping(value = "api") +@RequestMapping(value = "api/job") public class JobController { private final JobInfoService schedulerService; diff --git a/src/main/java/com/lawtk/lawtkschedulerbe/controller/ScheduleController.java b/src/main/java/com/lawtk/lawtkschedulerbe/controller/ScheduleController.java index 49de36415f6476d3ce64d9138b26b8be3d997e55..feeaaa3600760d41e894af8a26415efca79a9c0c 100644 --- a/src/main/java/com/lawtk/lawtkschedulerbe/controller/ScheduleController.java +++ b/src/main/java/com/lawtk/lawtkschedulerbe/controller/ScheduleController.java @@ -1,6 +1,7 @@ package com.lawtk.lawtkschedulerbe.controller; import com.lawtk.lawtkschedulerbe.entity.Schedule; +import com.lawtk.lawtkschedulerbe.repository.ScheduleRepository; import com.lawtk.lawtkschedulerbe.service.ScheduleService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -13,10 +14,12 @@ import java.util.List; @RequestMapping(value = "api") public class ScheduleController { private final ScheduleService service; + private final ScheduleRepository scheduleRepository; @Autowired - public ScheduleController(ScheduleService service){ + public ScheduleController(ScheduleService service, ScheduleRepository scheduleRepository){ this.service = service; + this.scheduleRepository = scheduleRepository; } @PostMapping(value = "/scheduler") @@ -35,12 +38,19 @@ public class ScheduleController { } @PutMapping(value = "/scheduler/{id}") - public Schedule updateSchedule(@PathVariable Integer id){ - return service.updateSchedule(service.retrieveScheduleById(id)); + public Schedule updateSchedule(@PathVariable Integer id, + @RequestBody Schedule inputSchedule){ + Schedule schedule = scheduleRepository.findById(id).get(); + schedule.setScheduleTime(inputSchedule.getScheduleTime()); + schedule.setScheduleInterval(inputSchedule.getScheduleInterval()); + schedule.setActivityName(inputSchedule.getActivityName()); + schedule.setUserId(schedule.getUserId()); + return service.updateSchedule(schedule); } @DeleteMapping(value = "/scheduler/{id}") public void deleteSchedule(@PathVariable Integer id){ + service.deleteSchedule(service.retrieveScheduleById(id)); } } diff --git a/src/main/java/com/lawtk/lawtkschedulerbe/entity/JobInfo.java b/src/main/java/com/lawtk/lawtkschedulerbe/entity/JobInfo.java index c211bdce34fc0b991c4ff792fc9678d2b99dea79..889cc03d035f1c51823621585d924c75c1e65f2b 100644 --- a/src/main/java/com/lawtk/lawtkschedulerbe/entity/JobInfo.java +++ b/src/main/java/com/lawtk/lawtkschedulerbe/entity/JobInfo.java @@ -8,6 +8,8 @@ import lombok.NoArgsConstructor; import org.springframework.data.relational.core.mapping.Table; import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; import javax.persistence.Id; @EqualsAndHashCode(callSuper = true) @@ -18,6 +20,7 @@ import javax.persistence.Id; @Table("job_info") public class JobInfo extends AbstractEntity<JobInfo, Integer> { @Id +// @GeneratedValue(strategy= GenerationType.IDENTITY) private Integer id; private String jobName; @@ -26,8 +29,7 @@ public class JobInfo extends AbstractEntity<JobInfo, Integer> { private String jobClass; private String cronExpression; private String description; - private String interfaceName; - private Long repeatTime; private Boolean cronJob; private Integer scheduleId; + private String baseJobName; } diff --git a/src/main/java/com/lawtk/lawtkschedulerbe/entity/Schedule.java b/src/main/java/com/lawtk/lawtkschedulerbe/entity/Schedule.java index 25ff549db0c076db7033c2c763ede40db45ea5f3..0654388de9e04f9728e975db4eb9e38f913eddda 100644 --- a/src/main/java/com/lawtk/lawtkschedulerbe/entity/Schedule.java +++ b/src/main/java/com/lawtk/lawtkschedulerbe/entity/Schedule.java @@ -8,6 +8,8 @@ import lombok.NoArgsConstructor; import org.springframework.data.relational.core.mapping.Table; import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; import javax.persistence.Id; @EqualsAndHashCode(callSuper = true) @@ -18,6 +20,7 @@ import javax.persistence.Id; @Table("schedule") public class Schedule extends AbstractEntity<Schedule, Integer> { @Id + @GeneratedValue(strategy= GenerationType.IDENTITY) private Integer id; private String activityName; diff --git a/src/main/java/com/lawtk/lawtkschedulerbe/quartz/component/JobScheduleCreator.java b/src/main/java/com/lawtk/lawtkschedulerbe/quartz/component/JobScheduleCreator.java index e99534df1312026836d9a4b6f5559fd2f32526a2..2d98bb78fc8e2b8c212d318cf950a870b9d26e26 100644 --- a/src/main/java/com/lawtk/lawtkschedulerbe/quartz/component/JobScheduleCreator.java +++ b/src/main/java/com/lawtk/lawtkschedulerbe/quartz/component/JobScheduleCreator.java @@ -39,10 +39,16 @@ public class JobScheduleCreator { public CronTrigger createCronTrigger(String triggerName, Date startTime, String cronExpression, int misFireInstruction) { CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean(); + JobDataMap jobDataMap = new JobDataMap(); + jobDataMap.put("name", triggerName); + jobDataMap.put("cron", cronExpression); + factoryBean.setName(triggerName); factoryBean.setStartTime(startTime); factoryBean.setCronExpression(cronExpression); factoryBean.setMisfireInstruction(misFireInstruction); + factoryBean.setJobDataMap(jobDataMap); + try { factoryBean.afterPropertiesSet(); } catch (ParseException e) { @@ -50,16 +56,5 @@ public class JobScheduleCreator { } return factoryBean.getObject(); } - - public SimpleTrigger createSimpleTrigger(String triggerName, Date startTime, Long repeatTime, int misFireInstruction) { - SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean(); - factoryBean.setName(triggerName); - factoryBean.setStartTime(startTime); - factoryBean.setRepeatInterval(repeatTime); - factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); - factoryBean.setMisfireInstruction(misFireInstruction); - factoryBean.afterPropertiesSet(); - return factoryBean.getObject(); - } } diff --git a/src/main/java/com/lawtk/lawtkschedulerbe/quartz/job/SampleCronJob.java b/src/main/java/com/lawtk/lawtkschedulerbe/quartz/job/SampleCronJob.java index 3749a5f3f86cf8c568183f7896a04bbd3afe0184..cfca5bdefb01bf3aae7b8a3811de743350d23fd9 100644 --- a/src/main/java/com/lawtk/lawtkschedulerbe/quartz/job/SampleCronJob.java +++ b/src/main/java/com/lawtk/lawtkschedulerbe/quartz/job/SampleCronJob.java @@ -6,6 +6,7 @@ import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; +import java.util.Date; import java.util.stream.IntStream; @Slf4j @@ -13,8 +14,11 @@ import java.util.stream.IntStream; public class SampleCronJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { + Date currentTime = new Date(); + log.info(String.valueOf(currentTime)); log.info("SampleCronJob Start................"); - String jobName = context.getJobDetail().getJobDataMap().getString("name"); + String jobName = context.getTrigger().getJobDataMap().getString("name"); + log.info("the cron exp is: " + context.getTrigger().getJobDataMap().getString("cron")); log.info("It's time for " + jobName); log.info("SampleCronJob End................"); } diff --git a/src/main/java/com/lawtk/lawtkschedulerbe/service/JobInfoServiceImpl.java b/src/main/java/com/lawtk/lawtkschedulerbe/service/JobInfoServiceImpl.java index 7bb8aae5376c0b7a8b45d48137c505ee5ceb7a6c..d867b79e7a18fb731298b6fe720d648f72094e22 100644 --- a/src/main/java/com/lawtk/lawtkschedulerbe/service/JobInfoServiceImpl.java +++ b/src/main/java/com/lawtk/lawtkschedulerbe/service/JobInfoServiceImpl.java @@ -53,7 +53,6 @@ public class JobInfoServiceImpl implements JobInfoService { } else { jobInfo.setJobClass(SimpleJob.class.getName()); jobInfo.setCronJob(false); - jobInfo.setRepeatTime((long) 1); } if (jobInfo.getId() != null) { log.info("Job Info: {}", jobInfo); @@ -62,7 +61,6 @@ public class JobInfoServiceImpl implements JobInfoService { updateScheduleJob(jobInfo); } jobInfo.setDescription("i am job number " + jobInfo.getId()); - jobInfo.setInterfaceName("interface_" + jobInfo.getId()); log.info(">>>>> jobName = [" + jobInfo.getJobName() + "]" + " created."); return jobInfo; } @@ -79,15 +77,9 @@ public class JobInfoServiceImpl implements JobInfoService { (Class<? extends QuartzJobBean>) Class.forName(jobInfo.getJobClass()), false, context, jobInfo.getJobName(), jobInfo.getJobGroup()); - Trigger trigger; + Trigger trigger = scheduleCreator.createCronTrigger(jobInfo.getJobName(), new Date(), + jobInfo.getCronExpression(), SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW); - if (jobInfo.getCronJob()) { - trigger = scheduleCreator.createCronTrigger(jobInfo.getJobName(), new Date(), - jobInfo.getCronExpression(), SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW); - } else { - trigger = scheduleCreator.createSimpleTrigger(jobInfo.getJobName(), new Date(), - jobInfo.getRepeatTime(), SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW); - } scheduler.scheduleJob(jobDetail, trigger); jobInfo.setJobStatus("SCHEDULED"); jobInfoRepository.save(EntityUtils.persistable(jobInfo, true)); @@ -103,16 +95,12 @@ public class JobInfoServiceImpl implements JobInfoService { } public JobInfo updateScheduleJob(JobInfo jobInfo){ - Trigger newTrigger; - if (jobInfo.getCronJob()) { - newTrigger = scheduleCreator.createCronTrigger(jobInfo.getJobName(), new Date(), - jobInfo.getCronExpression(), SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW); - } else { - newTrigger = scheduleCreator.createSimpleTrigger(jobInfo.getJobName(), new Date(), jobInfo.getRepeatTime(), - SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW); - } + Trigger newTrigger = scheduleCreator.createCronTrigger(jobInfo.getJobName(), + new Date(), + jobInfo.getCronExpression(), + SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW); try { - schedulerFactoryBean.getScheduler().rescheduleJob(TriggerKey.triggerKey(jobInfo.getJobName()), newTrigger); + schedulerFactoryBean.getScheduler().rescheduleJob(TriggerKey.triggerKey(jobInfo.getBaseJobName()), newTrigger); jobInfo.setJobStatus("EDITED & SCHEDULED"); jobInfoRepository.save(jobInfo); log.info(">>>>> jobName = [" + jobInfo.getJobName() + "]" + " updated and scheduled."); @@ -125,10 +113,10 @@ public class JobInfoServiceImpl implements JobInfoService { public void deleteJob(JobInfo jobInfo){ try { - JobInfo getJobInfo = jobInfoRepository.findByJobName(jobInfo.getJobName()); - jobInfoRepository.delete(getJobInfo); log.info(">>>>> jobName = [" + jobInfo.getJobName() + "]" + " deleted."); - schedulerFactoryBean.getScheduler().deleteJob(new JobKey(jobInfo.getJobName(), jobInfo.getJobGroup())); + + schedulerFactoryBean.getScheduler().deleteJob(new JobKey(jobInfo.getBaseJobName(), jobInfo.getJobGroup())); + jobInfoRepository.delete(jobInfo); } catch (SchedulerException e) { log.error("Failed to delete job - {}", jobInfo.getJobName(), e); } diff --git a/src/main/java/com/lawtk/lawtkschedulerbe/service/ScheduleServiceImpl.java b/src/main/java/com/lawtk/lawtkschedulerbe/service/ScheduleServiceImpl.java index 8011f994095d4f3dba06a69563a1e20c1cb5d4ca..e938bd4f8adea08ab5926055cf443e2d03d17413 100644 --- a/src/main/java/com/lawtk/lawtkschedulerbe/service/ScheduleServiceImpl.java +++ b/src/main/java/com/lawtk/lawtkschedulerbe/service/ScheduleServiceImpl.java @@ -1,6 +1,8 @@ package com.lawtk.lawtkschedulerbe.service; +import com.lawtk.lawtkschedulerbe.entity.JobInfo; import com.lawtk.lawtkschedulerbe.entity.Schedule; +import com.lawtk.lawtkschedulerbe.repository.JobInfoRepository; import com.lawtk.lawtkschedulerbe.repository.ScheduleRepository; import com.lawtk.lawtkschedulerbe.util.EntityUtils; import lombok.extern.slf4j.Slf4j; @@ -8,17 +10,45 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.transaction.Transactional; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; import java.util.List; @Slf4j @Service -@Transactional +//@Transactional public class ScheduleServiceImpl implements ScheduleService { @Autowired ScheduleRepository scheduleRepository; + @Autowired + JobInfoService jobInfoService; + + @Autowired + JobInfoRepository jobInfoRepository; + public Schedule addSchedule(Schedule schedule){ - return scheduleRepository.save(EntityUtils.persistable(schedule, true)); + JobInfo jobInfo = new JobInfo(); + scheduleRepository.save(EntityUtils.persistable(schedule, true)); + + jobInfo.setId(schedule.getId()); + jobInfo.setJobName(schedule.getActivityName()); + jobInfo.setJobGroup("CronJob"); + jobInfo.setJobStatus("NORMAL"); + jobInfo.setJobClass("CronJob"); + jobInfo.setDescription("Job for activity: " + schedule.getActivityName()); + jobInfo.setCronJob(true); + jobInfo.setScheduleId(schedule.getId()); + jobInfo.setBaseJobName(schedule.getActivityName()); + + String cronExpression = createCronExpression(schedule.getScheduleTime(), schedule.getScheduleInterval()); + + jobInfo.setCronExpression(cronExpression); + + jobInfoService.saveOrUpdate(jobInfo); + + return schedule; } public Schedule retrieveScheduleById(Integer id){ @@ -30,10 +60,80 @@ public class ScheduleServiceImpl implements ScheduleService { } public Schedule updateSchedule(Schedule schedule){ - return scheduleRepository.save(schedule); + scheduleRepository.save(schedule); + + JobInfo jobInfo = jobInfoRepository.findById(schedule.getId()).get(); + + //template cron, need affirmation// +// String cronExpression = "0/10 * * * * ?"; + + String cronExpression = createCronExpression(schedule.getScheduleTime(), schedule.getScheduleInterval()); + + jobInfo.setCronExpression(cronExpression); + jobInfo.setJobName(schedule.getActivityName()); + jobInfo.setCronJob(true); + jobInfoService.updateScheduleJob(jobInfo); + + return schedule; } public void deleteSchedule(Schedule schedule){ + + JobInfo jobInfo = jobInfoRepository.findById(schedule.getId()).get(); + jobInfoService.deleteJob(jobInfo); scheduleRepository.delete(schedule); } + + public String createCronExpression(Integer time, String interval){ + String cronExpression = ""; + Date date = new Date(); + LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + int day = localDate.getDayOfMonth(); + int month = localDate.getMonthValue(); + + + switch (interval) { + case "Minutes": + if (time >= 0 && time<= 60){ + cronExpression = String.format("0 */%d * ? * *", time); + }else{ + System.out.println("ERROR"); + } + break; + case "Hours": + if (time >= 0 && time<= 24){ + cronExpression = String.format("0 0 */%d ? * *", time); + }else{ + System.out.println("ERROR"); + } + break; + case "Days": + if (time >= 1 && time<= 31){ + cronExpression = String.format("0 0 0 %d/%d * ?",day, time); + }else{ + System.out.println("ERROR"); + } + break; + case "Weeks": + if (time >= 1 && time<= 4){ + cronExpression = String.format("0 0 0 %d/%d * ?",day, time*7); + }else{ + System.out.println("ERROR"); + } + break; + case "Months": + if (time >= 1 && time<= 12){ + cronExpression = String.format("0 0 0 %d %d/%d ?", day, month, time); + }else{ + System.out.println("ERROR"); + } + break; + } + + if (cronExpression.equals("")){ + cronExpression = "ERROR"; + } + + return cronExpression; + } } diff --git a/src/main/resources/db/migration/V2__remindme_db_init.sql b/src/main/resources/db/migration/V2__remindme_db_init.sql index eb6e07e0d6a330e39ab7aa611a3098849c3b200f..409c335716e4aa99b44b9986158ed283b9082bc0 100644 --- a/src/main/resources/db/migration/V2__remindme_db_init.sql +++ b/src/main/resources/db/migration/V2__remindme_db_init.sql @@ -32,10 +32,9 @@ CREATE TABLE IF NOT EXISTS job_info ( job_class varchar(255) NOT NULL, cron_expression varchar(255) NOT NULL, description varchar(255) NOT NULL, - interface_name varchar(255) NOT NULL, - repeat_time BIGINT NOT NULL, cron_job BOOLEAN NOT NULL, schedule_id int(11) NOT NULL, + base_job_name varchar(255) NULL, PRIMARY KEY (id), FOREIGN KEY (schedule_id) REFERENCES schedule(id)