diff --git a/quartz-manager-parent/quartz-manager-starter-api/pom.xml b/quartz-manager-parent/quartz-manager-starter-api/pom.xml index 512eee2..b200ffa 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/pom.xml +++ b/quartz-manager-parent/quartz-manager-starter-api/pom.xml @@ -91,45 +91,45 @@ 1.3.2 - - - io.projectreactor - reactor-core - - - io.projectreactor - reactor-net - 2.0.8.RELEASE - - - io.projectreactor.spring - reactor-spring-context - 2.0.7.RELEASE - - - io.netty - netty-all - - - org.springframework.boot - spring-boot-starter-aop - - - org.yaml - snakeyaml - + + + io.projectreactor + reactor-core + + + io.projectreactor + reactor-net + 2.0.8.RELEASE + + + io.projectreactor.spring + reactor-spring-context + 2.0.7.RELEASE + + + io.netty + netty-all + + + org.springframework.boot + spring-boot-starter-aop + + + org.yaml + snakeyaml + - - io.springfox - springfox-swagger2 - ${springfox.version} - - - io.springfox - springfox-swagger-ui - ${springfox.version} - + + io.springfox + springfox-swagger2 + ${springfox.version} + + + io.springfox + springfox-swagger-ui + ${springfox.version} + 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 7701a35..4d9749a 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 @@ -3,8 +3,6 @@ package it.fabioformosa.quartzmanager.configuration; import it.fabioformosa.quartzmanager.common.properties.QuartzModuleProperties; import it.fabioformosa.quartzmanager.scheduler.AutowiringSpringBeanJobFactory; import org.quartz.Job; -import org.quartz.JobDetail; -import org.quartz.SimpleTrigger; import org.quartz.spi.JobFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -17,7 +15,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.scheduling.quartz.JobDetailFactoryBean; import org.springframework.scheduling.quartz.SchedulerFactoryBean; -import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean; import java.io.IOException; import java.util.Properties; @@ -27,8 +24,6 @@ import java.util.Properties; @ConditionalOnProperty(name = "quartz.enabled") public class SchedulerConfig { - private static final int DEFAULT_MISFIRE_INSTRUCTION = SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT; - private static JobDetailFactoryBean createJobDetail(Class jobClass) { JobDetailFactoryBean factoryBean = new JobDetailFactoryBean(); factoryBean.setJobClass(jobClass); @@ -36,35 +31,13 @@ public class SchedulerConfig { return factoryBean; } - private static SimpleTriggerFactoryBean createTrigger(JobDetail jobDetail, long pollFrequencyMs, - int repeatCount) { - SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean(); - factoryBean.setJobDetail(jobDetail); - factoryBean.setStartDelay(3000L); - factoryBean.setRepeatInterval(pollFrequencyMs); - factoryBean.setRepeatCount(repeatCount); - factoryBean - .setMisfireInstruction(DEFAULT_MISFIRE_INSTRUCTION);// in case of misfire, ignore all missed triggers and continue - return factoryBean; - } - @Value("${quartz-manager.jobClass}") private String jobClassname; @Autowired(required = false) private QuartzModuleProperties quartzModuleProperties; - - // REMOVEME -// @Bean(name = "triggerMonitor") -// public TriggerMonitor createTriggerMonitor(@Qualifier("jobTrigger") Trigger trigger) { -// TriggerMonitor triggerMonitor = new TriggerMonitorImpl(); -// triggerMonitor.setTrigger(trigger); -// return triggerMonitor; -// } - @Bean - @SuppressWarnings("unchecked") public JobDetailFactoryBean jobDetail() throws ClassNotFoundException { Class JobClass = (Class) Class.forName(jobClassname); return createJobDetail(JobClass); @@ -85,24 +58,15 @@ public class SchedulerConfig { return propertiesFactoryBean.getObject(); } -// @Bean(name = "jobTrigger") -// public SimpleTriggerFactoryBean sampleJobTrigger(@Qualifier("jobDetail") JobDetail jobDetail, -// @Value("${job.frequency}") long frequency, @Value("${job.repeatCount}") int repeatCount) { -// return createTrigger(jobDetail, frequency, repeatCount); -// } - @Bean(name = "scheduler") public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory) throws IOException { -// public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory, -// @Qualifier("jobTrigger") Trigger sampleJobTrigger) throws IOException { SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setJobFactory(jobFactory); Properties mergedProperties = new Properties(); - mergedProperties.putAll(quartzProperties()); if(quartzModuleProperties != null) mergedProperties.putAll(quartzModuleProperties.getProperties()); + mergedProperties.putAll(quartzProperties()); factory.setQuartzProperties(mergedProperties); - //factory.setTriggers(sampleJobTrigger); factory.setAutoStartup(false); return factory; } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java index ca554ba..ebd4887 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/SchedulerController.java @@ -38,24 +38,15 @@ public class SchedulerController { this.conversionService = conversionService; } - // @Resource -// private Scheduler scheduler; - - //TODO REMOVEME -// @Resource -// private TriggerMonitor triggerMonitor; - @Resource private ConversionService conversionService; @GetMapping("/config") public SchedulerConfigParam getConfig() throws SchedulerException { log.debug("SCHEDULER - GET CONFIG params"); - SchedulerConfigParam schedulerConfigParam = schedulerService.getOneSimpleTrigger() .map(SchedulerController::fromSimpleTriggerToSchedulerConfigParam) .orElse(new SchedulerConfigParam(0, 0, 0)); - return schedulerConfigParam; } @@ -66,8 +57,6 @@ public class SchedulerController { return new SchedulerConfigParam(triggersPerDay, maxCount, timesTriggered); } - - @GetMapping public SchedulerDTO getScheduler() { log.debug("SCHEDULER - GET Scheduler..."); @@ -114,26 +103,6 @@ public class SchedulerController { schedulerService.getScheduler().standby(); } -// @PostMapping("/config") -// public SchedulerConfigParam postConfig(@RequestBody SchedulerConfigParam config) throws SchedulerException { -// log.info("SCHEDULER - NEW CONFIG {}", config); -// -// int intervalInMills = SchedulerService.fromTriggerPerDayToMillsInterval(config.getTriggerPerDay()); -// -// Trigger newTrigger = TriggerBuilder.newTrigger() -// .withSchedule( -// SimpleScheduleBuilder.simpleSchedule() -// .withIntervalInMilliseconds(intervalInMills) -// .withRepeatCount(config.getMaxCount() - 1) -// .withMisfireHandlingInstructionNextWithRemainingCount() -// ) -// .build(); -// -// schedulerService.getScheduler().rescheduleJob(schedulerService.getOneTriggerKey().get(), newTrigger); -//// triggerMonitor.setTrigger(newTrigger); REMOVEME -// return config; -// } - @GetMapping("/resume") @ResponseStatus(HttpStatus.NO_CONTENT) public void resume() throws SchedulerException { diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/TriggerController.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/TriggerController.java index 9bb9498..19c3f13 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/TriggerController.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/TriggerController.java @@ -5,13 +5,10 @@ import it.fabioformosa.quartzmanager.dto.SchedulerConfigParam; import it.fabioformosa.quartzmanager.dto.TriggerDTO; import it.fabioformosa.quartzmanager.services.SchedulerService; import lombok.extern.slf4j.Slf4j; -import org.quartz.*; +import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.convert.ConversionService; import org.springframework.web.bind.annotation.*; -import java.util.Optional; - @Slf4j @RequestMapping("/quartz-manager/triggers") @RestController @@ -21,83 +18,31 @@ public class TriggerController { @Value("${quartz-manager.jobClass}") private String jobClassname; - private Scheduler scheduler; private SchedulerService schedulerService; - private ConversionService conversionService; - public TriggerController(Scheduler scheduler, SchedulerService schedulerService, ConversionService conversionService) { - this.scheduler = scheduler; + public TriggerController(SchedulerService schedulerService) { this.schedulerService = schedulerService; - this.conversionService = conversionService; } @GetMapping("/{name}") public TriggerDTO getTrigger(@PathVariable String name) throws SchedulerException { - Trigger trigger = scheduler.getTrigger(new TriggerKey(name)); - TriggerDTO triggerDTO = conversionService.convert(trigger, TriggerDTO.class); - return triggerDTO; + return schedulerService.getTriggerByName(name); } @PostMapping("/{name}") public TriggerDTO postTrigger(@PathVariable String name, @RequestBody SchedulerConfigParam config) throws SchedulerException, ClassNotFoundException { - log.info("TRIGGER - POST trigger {}", config); - int intervalInMills = SchedulerService.fromTriggerPerDayToMillsInterval(config.getTriggerPerDay()); - - Class jobClass = (Class) Class.forName(jobClassname); - JobDetail jobDetail = JobBuilder.newJob() - .ofType(jobClass) - .storeDurably(false) - .build(); - - Trigger newTrigger = TriggerBuilder.newTrigger() - .withSchedule( - SimpleScheduleBuilder.simpleSchedule() - .withIntervalInMilliseconds(intervalInMills) - .withRepeatCount(config.getMaxCount() - 1) - .withMisfireHandlingInstructionNextWithRemainingCount() - ) - .withIdentity(name) - .build(); - -// Optional optionalTriggerKey = schedulerService.getTriggerByKey(name); -// TriggerKey triggerKey = optionalTriggerKey.orElse(TriggerKey.triggerKey(name)); - - scheduler.scheduleJob(jobDetail, newTrigger); -// scheduler.rescheduleJob(triggerKey, newTrigger); - - TriggerDTO newTriggerDTO = conversionService.convert(newTrigger, TriggerDTO.class); - - log.info("Rescheduled new trigger {}", newTriggerDTO); + log.info("TRIGGER - CREATING a trigger {} {}", name, config); + TriggerDTO newTriggerDTO = schedulerService.scheduleNewTrigger(name, jobClassname, config); + log.info("TRIGGER - CREATED a trigger {}", newTriggerDTO); return newTriggerDTO; } @PutMapping("/{name}") - public TriggerDTO rescheduleTrigger(@PathVariable String name, @RequestBody SchedulerConfigParam config) throws SchedulerException, ClassNotFoundException { - log.info("TRIGGER - RESCHEDULE trigger {}", config); - int intervalInMills = SchedulerService.fromTriggerPerDayToMillsInterval(config.getTriggerPerDay()); - - Optional optionalTriggerKey = schedulerService.getTriggerByKey(name); - TriggerKey triggerKey = optionalTriggerKey.orElse(TriggerKey.triggerKey(name)); - Trigger trigger = scheduler.getTrigger(triggerKey); - - Trigger newTrigger = TriggerBuilder.newTrigger() - .withSchedule( - SimpleScheduleBuilder.simpleSchedule() - .withIntervalInMilliseconds(intervalInMills) - .withRepeatCount(config.getMaxCount() - 1) - .withMisfireHandlingInstructionNextWithRemainingCount() - ) - .forJob(trigger.getJobKey().getName()) - .withIdentity(name) - .build(); - -// scheduler.scheduleJob(jobDetail, newTrigger); - scheduler.rescheduleJob(triggerKey, newTrigger); - - TriggerDTO newTriggerDTO = conversionService.convert(newTrigger, TriggerDTO.class); - - log.info("Rescheduled new trigger {}", newTriggerDTO); - return newTriggerDTO; + public TriggerDTO rescheduleTrigger(@PathVariable String name, @RequestBody SchedulerConfigParam config) throws SchedulerException { + log.info("TRIGGER - RESCHEDULING the trigger {} {}", name, config); + TriggerDTO triggerDTO = schedulerService.rescheduleTrigger(name, config); + log.info("TRIGGER - RESCHEDULED the trigger {}", triggerDTO); + return triggerDTO; } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java index 5e431ea..9e1b820 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/UserController.java @@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping(value = "/quartz-manager/api", produces = MediaType.APPLICATION_JSON_VALUE) public class UserController { - @GetMapping("/whoami") public @ResponseBody Object user() { SecurityContext context = SecurityContextHolder.getContext(); @@ -21,12 +20,12 @@ public class UserController { return "\"NO_AUTH\""; } - /** - * JWT Temporary disabled - * - * @author Fabio.Formosa - * - */ +// /** +// * JWT Temporary disabled +// * +// * @author Fabio.Formosa +// * +// */ // @Autowired // private UserService userService; diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/services/SchedulerService.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/services/SchedulerService.java index 75f63d5..7900aee 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/services/SchedulerService.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/services/SchedulerService.java @@ -1,11 +1,11 @@ package it.fabioformosa.quartzmanager.services; import it.fabioformosa.quartzmanager.common.utils.Try; -import org.quartz.Scheduler; -import org.quartz.SchedulerException; -import org.quartz.SimpleTrigger; -import org.quartz.TriggerKey; +import it.fabioformosa.quartzmanager.dto.SchedulerConfigParam; +import it.fabioformosa.quartzmanager.dto.TriggerDTO; +import org.quartz.*; import org.quartz.impl.matchers.GroupMatcher; +import org.springframework.core.convert.ConversionService; import org.springframework.stereotype.Service; import java.util.Optional; @@ -17,9 +17,11 @@ public class SchedulerService { public static final int SEC_IN_A_DAY = 60 * 60 * 24; private Scheduler scheduler; + private ConversionService conversionService; - public SchedulerService(Scheduler scheduler) { + public SchedulerService(Scheduler scheduler, ConversionService conversionService) { this.scheduler = scheduler; + this.conversionService = conversionService; } public static int fromTriggerPerDayToMillsInterval(long triggerPerDay) { @@ -57,4 +59,56 @@ public class SchedulerService { .findFirst(); } + public TriggerDTO getTriggerByName(String name) throws SchedulerException { + Trigger trigger = scheduler.getTrigger(new TriggerKey(name)); + return conversionService.convert(trigger, TriggerDTO.class); + } + + public TriggerDTO scheduleNewTrigger(String name, String jobClassname, SchedulerConfigParam config) throws SchedulerException, ClassNotFoundException { + Class jobClass = (Class) Class.forName(jobClassname); + JobDetail jobDetail = JobBuilder.newJob() + .ofType(jobClass) + .storeDurably(false) + .build(); + + int intervalInMills = SchedulerService.fromTriggerPerDayToMillsInterval(config.getTriggerPerDay()); + + Trigger newTrigger = TriggerBuilder.newTrigger() + .withSchedule( + SimpleScheduleBuilder.simpleSchedule() + .withIntervalInMilliseconds(intervalInMills) + .withRepeatCount(config.getMaxCount() - 1) + .withMisfireHandlingInstructionNextWithRemainingCount() + ) + .withIdentity(name) + .build(); + + scheduler.scheduleJob(jobDetail, newTrigger); + + return conversionService.convert(newTrigger, TriggerDTO.class); + } + + public TriggerDTO rescheduleTrigger(String name, SchedulerConfigParam config) throws SchedulerException { + int intervalInMills = SchedulerService.fromTriggerPerDayToMillsInterval(config.getTriggerPerDay()); + + Optional optionalTriggerKey = getTriggerByKey(name); + TriggerKey triggerKey = optionalTriggerKey.orElse(TriggerKey.triggerKey(name)); + Trigger trigger = scheduler.getTrigger(triggerKey); + + Trigger newTrigger = TriggerBuilder.newTrigger() + .withSchedule( + SimpleScheduleBuilder.simpleSchedule() + .withIntervalInMilliseconds(intervalInMills) + .withRepeatCount(config.getMaxCount() - 1) + .withMisfireHandlingInstructionNextWithRemainingCount() + ) + .forJob(trigger.getJobKey().getName()) + .withIdentity(name) + .build(); + + scheduler.rescheduleJob(triggerKey, newTrigger); + + return conversionService.convert(newTrigger, TriggerDTO.class); + } + } diff --git a/quartz-manager-parent/quartz-manager-web-showcase/pom.xml b/quartz-manager-parent/quartz-manager-web-showcase/pom.xml index 371f02a..d291ec7 100644 --- a/quartz-manager-parent/quartz-manager-web-showcase/pom.xml +++ b/quartz-manager-parent/quartz-manager-web-showcase/pom.xml @@ -41,70 +41,66 @@ - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-security - - - - - - - org.springframework.boot - spring-boot-devtools - org.springframework.boot - spring-boot-configuration-processor - true + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + org.springframework.boot + spring-boot-starter-test + test - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - org.springframework.boot - spring-boot-starter-test - test - - - io.jsonwebtoken - jjwt - 0.9.0 - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.core - jackson-annotations - - - com.h2database - h2 - runtime - - - org.codehaus.groovy - groovy - - - net.sourceforge.nekohtml - nekohtml - - - io.rest-assured - spring-mock-mvc - test - + + io.jsonwebtoken + jjwt + 0.9.0 + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-annotations + + + com.h2database + h2 + runtime + + + org.codehaus.groovy + groovy + + + net.sourceforge.nekohtml + nekohtml + + + io.rest-assured + spring-mock-mvc + test + org.projectlombok lombok @@ -114,18 +110,6 @@ org.apache.commons commons-lang3 - - - - - - - - - - - - diff --git a/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/jobs/myjobs/SampleJob.java b/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/jobs/myjobs/SampleJob.java index 203c5b5..7c13981 100644 --- a/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/jobs/myjobs/SampleJob.java +++ b/quartz-manager-parent/quartz-manager-web-showcase/src/main/java/it/fabioformosa/quartzmanager/jobs/myjobs/SampleJob.java @@ -8,10 +8,9 @@ import it.fabioformosa.quartzmanager.jobs.entities.LogRecord.LogType; public class SampleJob extends AbstractLoggingJob { - @Override public LogRecord doIt(JobExecutionContext jobExecutionContext) { - return new LogRecord(LogType.INFO, "Hello!"); + return new LogRecord(LogType.INFO, "Hello!"); } } 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 9f468cc..eb534ff 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 @@ -13,10 +13,6 @@ spring: mode: LEGACYHTML5 jpa.open-in-view: false -# quartz: -# org.quartz.jobStore.isClustered: true -# org.quartz.scheduler.instanceId=AUTO - quartz: enabled: true 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 d00f153..cdcc9e4 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,2 @@ org.quartz.scheduler.instanceName=example -org.quartz.scheduler.instanceId=AUTO org.quartz.threadPool.threadCount=1