diff --git a/quartz-manager-frontend/angular.json b/quartz-manager-frontend/angular.json index 7ebabad..481e9c6 100644 --- a/quartz-manager-frontend/angular.json +++ b/quartz-manager-frontend/angular.json @@ -108,11 +108,11 @@ "defaultProject": "angular-spring-starter", "schematics": { "@schematics/angular:component": { - "prefix": "app", + "prefix": "qrzmng", "style": "css" }, "@schematics/angular:directive": { - "prefix": "app" + "prefix": "qrzmng" } } -} \ No newline at end of file +} diff --git a/quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.html b/quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.html index b231607..630519b 100644 --- a/quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.html +++ b/quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.html @@ -2,35 +2,56 @@ SCHEDULER CONFIG - + + + + + + + +
- - + + - + - +
Misfire Policy
RESCHEDULE NEXT WITH REMAINING COUNT
- In case of misfire event, the trigger is re-scheduled to the next scheduled time after 'now' with the repeat count set to what it would be, if it had not missed any firings. + In case of misfire event, the trigger is re-scheduled to the next scheduled time after 'now' with the repeat count set to what it would be, if it had not missed any firings.
- Warning: This policy could cause the Trigger to go directly to the 'COMPLETE' state if all fire-times where missed. + Warning: This policy could cause the Trigger to go directly to the 'COMPLETE' state if all fire-times where missed.
- +
+
diff --git a/quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.ts b/quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.ts index 417cbe3..ea5cd31 100644 --- a/quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.ts +++ b/quartz-manager-frontend/src/app/components/scheduler-config/scheduler-config.component.ts @@ -1,40 +1,65 @@ import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; import { SchedulerService } from '../../services'; import { SchedulerConfig } from '../../model/schedulerConfig.model' +import {Scheduler} from '../../model/scheduler.model'; @Component({ - selector: 'scheduler-config', + selector: 'qrzmng-scheduler-config', templateUrl: './scheduler-config.component.html', styleUrls: ['./scheduler-config.component.scss'] }) export class SchedulerConfigComponent implements OnInit { + config: SchedulerConfig = new SchedulerConfig() + configBackup: SchedulerConfig = new SchedulerConfig() + scheduler: Scheduler; + + triggerLoading = true; + enabledTriggerForm = false; + private fetchedTriggers = false; + private triggerInProgress = false; + constructor( private schedulerService: SchedulerService ) { } - config : SchedulerConfig = new SchedulerConfig() - configBackup : SchedulerConfig = new SchedulerConfig() - ngOnInit() { - this.retrieveConfig() + this.triggerLoading = true; + this._getScheduler(); + this.retrieveConfig(); } retrieveConfig = () => { this.schedulerService.getConfig() .subscribe(res => { - this.config = new SchedulerConfig(res.triggerPerDay, res.maxCount) + this.config = new SchedulerConfig(res.triggerPerDay, res.maxCount, res.timesTriggered) this.configBackup = res + this.triggerLoading = false; + this.triggerInProgress = res.timesTriggered < res.maxCount; }) } + private _getScheduler() { + this.schedulerService.getScheduler() + .subscribe( res => { + this.scheduler = res; + this.fetchedTriggers = this.scheduler.triggerKeys.length > 0 + }) + } + + shouldShowTriggerConfig = (): boolean => this.fetchedTriggers && this.triggerInProgress; + submitConfig = () => { this.schedulerService.updateConfig(this.config) .subscribe(res => { this.configBackup = this.config; + this.enabledTriggerForm = false; + this.fetchedTriggers = true; + this.triggerInProgress = true; }, error => { this.config = this.configBackup; }); }; + enableTriggerForm = () => this.enabledTriggerForm = true; } diff --git a/quartz-manager-frontend/src/app/model/scheduler.model.ts b/quartz-manager-frontend/src/app/model/scheduler.model.ts new file mode 100644 index 0000000..adad75f --- /dev/null +++ b/quartz-manager-frontend/src/app/model/scheduler.model.ts @@ -0,0 +1,13 @@ +import {TriggerKey} from './triggerKey.model'; + +export class Scheduler { + name: string; + instanceId: string; + triggerKeys: TriggerKey[]; + + constructor(name: string, instanceId: string, triggerKeys: TriggerKey[]) { + this.name = name; + this.instanceId = instanceId; + this.triggerKeys = triggerKeys; + } +} diff --git a/quartz-manager-frontend/src/app/model/schedulerConfig.model.ts b/quartz-manager-frontend/src/app/model/schedulerConfig.model.ts index 591ad68..35601cb 100644 --- a/quartz-manager-frontend/src/app/model/schedulerConfig.model.ts +++ b/quartz-manager-frontend/src/app/model/schedulerConfig.model.ts @@ -1,11 +1,13 @@ export class SchedulerConfig { - triggerPerDay : number = 0 - maxCount : number = 0 + triggerPerDay = 0; + maxCount = 0; + timesTriggered = 0; - constructor(triggerPerDay = 0, maxCount = 0) { - this.triggerPerDay = triggerPerDay - this.maxCount = maxCount + constructor(triggerPerDay = 0, maxCount = 0, timesTriggered = 0) { + this.triggerPerDay = triggerPerDay; + this.maxCount = maxCount; + this.timesTriggered = timesTriggered; } - - } \ No newline at end of file + + } diff --git a/quartz-manager-frontend/src/app/model/triggerKey.model.ts b/quartz-manager-frontend/src/app/model/triggerKey.model.ts new file mode 100644 index 0000000..5c3e156 --- /dev/null +++ b/quartz-manager-frontend/src/app/model/triggerKey.model.ts @@ -0,0 +1,9 @@ +export class TriggerKey { + name: string; + group: string; + + constructor(name: string, group: string) { + this.name = name; + this.group = group; + } +} diff --git a/quartz-manager-frontend/src/app/services/scheduler.service.ts b/quartz-manager-frontend/src/app/services/scheduler.service.ts index a4b4251..930df9f 100644 --- a/quartz-manager-frontend/src/app/services/scheduler.service.ts +++ b/quartz-manager-frontend/src/app/services/scheduler.service.ts @@ -12,20 +12,24 @@ export class SchedulerService { startScheduler = () => { return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler/run') } - + stopScheduler = () => { return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler/stop') } - + pauseScheduler = () => { return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler/pause') } - + resumeScheduler = () => { return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler/resume') } getStatus = () => { + return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler/status') + } + + getScheduler = () => { return this.apiService.get(getBaseUrl() + '/quartz-manager/scheduler') } @@ -34,6 +38,8 @@ export class SchedulerService { } updateConfig = (config: Object) => { - return this.apiService.post(getBaseUrl() + '/quartz-manager/scheduler/config', config) + return this.apiService.post(getBaseUrl() + '/quartz-manager/triggers/mytrigger', config) } + + } diff --git a/quartz-manager-frontend/src/app/views/manager/manager.component.html b/quartz-manager-frontend/src/app/views/manager/manager.component.html index 4375ae4..ac239e1 100644 --- a/quartz-manager-frontend/src/app/views/manager/manager.component.html +++ b/quartz-manager-frontend/src/app/views/manager/manager.component.html @@ -4,16 +4,16 @@

- +
- - + +

-
- + + diff --git a/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/common/utils/Try.java b/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/common/utils/Try.java new file mode 100644 index 0000000..67145d8 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-common/src/main/java/it/fabioformosa/quartzmanager/common/utils/Try.java @@ -0,0 +1,54 @@ +package it.fabioformosa.quartzmanager.common.utils; + +import java.util.function.Function; + +public class Try { + + private final Throwable failure; + private final R success; + + public Try(Throwable failure, R success) { + this.failure = failure; + this.success = success; + } + + public R getSuccess() { + return success; + } + + public static Try success(R r){ + return new Try<>(null, r); + } + + public static Try failure(Throwable e){ + return new Try<>(e, null); + } + + public static Function> with(CheckedFunction checkedFunction){ + return t -> { + try { + return Try.success(checkedFunction.apply(t)); + } catch (java.lang.Exception e) { + return Try.failure(e); + } + }; + } + + public static Function sneakyThrow(CheckedFunction checkedFunction){ + return t -> Try.with(checkedFunction).apply(t).getSuccess(); + } + + public boolean isSuccess(){ + return this.failure == null; + } + + public boolean isFailure(){ + return this.failure != null; + } + + @FunctionalInterface + public static interface CheckedFunction { + R apply(T t) throws java.lang.Exception; + } +} + diff --git a/quartz-manager-parent/quartz-manager-starter-api/pom.xml b/quartz-manager-parent/quartz-manager-starter-api/pom.xml index 70d57b2..512eee2 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/pom.xml +++ b/quartz-manager-parent/quartz-manager-starter-api/pom.xml @@ -1,128 +1,135 @@ - - - 4.0.0 - - it.fabioformosa.quartz-manager - quartz-manager-parent - 3.0.2-SNAPSHOT - - - quartz-manager-starter-api - - Quartz Manager Starter API - REST API layer for your scheduler and triggered jobs, to be included in your spring webapp - - https://github.com/fabioformosa/quartz-manager - - ${basedir}/../.. - UTF-8 - UTF-8 - 2.9.2 - 1.8 - - - - - it.fabioformosa.quartz-manager - quartz-manager-common - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-devtools - - - org.springframework.boot - spring-boot-starter-websocket - - - org.springframework.security - spring-security-core - - - org.springframework.boot - spring-boot-starter-test - test - - - - - com.fasterxml.jackson.core - jackson-annotations - - - com.h2database - h2 - runtime - - - org.projectlombok - lombok - provided - - - org.apache.commons - commons-lang3 - - - - - org.quartz-scheduler - quartz - - - org.apache.commons - commons-io - 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.springfox - springfox-swagger2 - ${springfox.version} - - - io.springfox - springfox-swagger-ui - ${springfox.version} - - - - + + + 4.0.0 + + it.fabioformosa.quartz-manager + quartz-manager-parent + 3.0.2-SNAPSHOT + + + quartz-manager-starter-api + + Quartz Manager Starter API + REST API layer for your scheduler and triggered jobs, to be included in your spring webapp + + https://github.com/fabioformosa/quartz-manager + + ${basedir}/../.. + UTF-8 + UTF-8 + 2.9.2 + 1.8 + + + + + it.fabioformosa.quartz-manager + quartz-manager-common + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.security + spring-security-core + + + org.springframework.boot + spring-boot-starter-test + test + + + + + com.fasterxml.jackson.core + jackson-annotations + + + com.h2database + h2 + runtime + + + org.projectlombok + lombok + provided + + + org.apache.commons + commons-lang3 + + + it.fabioformosa + metamorphosis-core + 3.0.0 + + + + + + org.quartz-scheduler + quartz + + + org.apache.commons + commons-io + 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.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/aspects/WebSocketProgressNotifier.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/aspects/WebSocketProgressNotifier.java index 74e550b..b0ac383 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/aspects/WebSocketProgressNotifier.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/aspects/WebSocketProgressNotifier.java @@ -1,9 +1,8 @@ package it.fabioformosa.quartzmanager.aspects; -import javax.annotation.Resource; - +import it.fabioformosa.quartzmanager.dto.TriggerStatus; +import it.fabioformosa.quartzmanager.services.SchedulerService; import org.quartz.DailyTimeIntervalTrigger; -import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SimpleTrigger; import org.quartz.Trigger; @@ -11,8 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.simp.SimpMessageSendingOperations; import org.springframework.stereotype.Component; -import it.fabioformosa.quartzmanager.dto.TriggerStatus; -import it.fabioformosa.quartzmanager.scheduler.TriggerMonitor; +import javax.annotation.Resource; /** * @@ -28,11 +26,14 @@ public class WebSocketProgressNotifier implements ProgressNotifier { @Autowired private SimpMessageSendingOperations messagingTemplate; - @Resource - private Scheduler scheduler; +// @Resource +// private Scheduler scheduler; @Resource - private TriggerMonitor triggerMonitor; + private SchedulerService schedulerService; + +// @Resource +// private TriggerMonitor triggerMonitor; //@AfterReturning("execution(* logAndSend(..))") // @Override @@ -44,7 +45,7 @@ public class WebSocketProgressNotifier implements ProgressNotifier { public void send() throws SchedulerException { TriggerStatus currTriggerStatus = new TriggerStatus(); - Trigger trigger = scheduler.getTrigger(triggerMonitor.getTrigger().getKey()); + Trigger trigger = schedulerService.getOneSimpleTrigger().get(); currTriggerStatus.setFinalFireTime(trigger.getFinalFireTime()); currTriggerStatus.setNextFireTime(trigger.getNextFireTime()); currTriggerStatus.setPreviousFireTime(trigger.getPreviousFireTime()); @@ -62,7 +63,7 @@ public class WebSocketProgressNotifier implements ProgressNotifier { repeatCount = dailyTrigger.getRepeatCount(); } - Trigger jobTrigger = triggerMonitor.getTrigger(); + Trigger jobTrigger = schedulerService.getOneSimpleTrigger().get(); if (jobTrigger != null && jobTrigger.getJobKey() != null) { currTriggerStatus.setJobKey(jobTrigger.getJobKey().getName()); currTriggerStatus.setJobClass(jobTrigger.getClass().getSimpleName()); diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/configuration/ConversionConfig.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/configuration/ConversionConfig.java new file mode 100644 index 0000000..964a723 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/configuration/ConversionConfig.java @@ -0,0 +1,9 @@ +package it.fabioformosa.quartzmanager.configuration; + +import it.fabioformosa.metamorphosis.core.EnableMetamorphosisConversions; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableMetamorphosisConversions(basePackages = { "it.fabioformosa.quartzmanager" }) +public class ConversionConfig { +} 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 3ce95d0..7701a35 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 @@ -1,15 +1,12 @@ package it.fabioformosa.quartzmanager.configuration; -import java.io.IOException; -import java.util.Properties; - +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.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; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -22,10 +19,8 @@ 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; +import java.io.IOException; +import java.util.Properties; @ComponentScan(basePackages = {"it.fabioformosa.quartzmanager.controllers"}) @Configuration @@ -59,12 +54,14 @@ public class SchedulerConfig { @Autowired(required = false) private QuartzModuleProperties quartzModuleProperties; - @Bean(name = "triggerMonitor") - public TriggerMonitor createTriggerMonitor(@Qualifier("jobTrigger") Trigger trigger) { - TriggerMonitor triggerMonitor = new TriggerMonitorImpl(); - triggerMonitor.setTrigger(trigger); - return triggerMonitor; - } + + // REMOVEME +// @Bean(name = "triggerMonitor") +// public TriggerMonitor createTriggerMonitor(@Qualifier("jobTrigger") Trigger trigger) { +// TriggerMonitor triggerMonitor = new TriggerMonitorImpl(); +// triggerMonitor.setTrigger(trigger); +// return triggerMonitor; +// } @Bean @SuppressWarnings("unchecked") @@ -88,15 +85,16 @@ 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 = "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, - @Qualifier("jobTrigger") Trigger sampleJobTrigger) throws IOException { + 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(); @@ -104,8 +102,8 @@ public class SchedulerConfig { if(quartzModuleProperties != null) mergedProperties.putAll(quartzModuleProperties.getProperties()); factory.setQuartzProperties(mergedProperties); - factory.setTriggers(sampleJobTrigger); + //factory.setTriggers(sampleJobTrigger); factory.setAutoStartup(false); return factory; } -} \ No newline at end of file +} 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 89427e6..ca554ba 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 @@ -1,161 +1,158 @@ package it.fabioformosa.quartzmanager.controllers; -import java.util.Collections; -import java.util.Map; - -import javax.annotation.Resource; - -import org.quartz.Scheduler; -import org.quartz.SchedulerException; -import org.quartz.SimpleScheduleBuilder; -import org.quartz.SimpleTrigger; -import org.quartz.Trigger; -import org.quartz.TriggerBuilder; -import org.quartz.impl.triggers.SimpleTriggerImpl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; - import io.swagger.annotations.Api; import it.fabioformosa.quartzmanager.dto.SchedulerConfigParam; +import it.fabioformosa.quartzmanager.dto.SchedulerDTO; import it.fabioformosa.quartzmanager.dto.TriggerStatus; import it.fabioformosa.quartzmanager.enums.SchedulerStates; -import it.fabioformosa.quartzmanager.scheduler.TriggerMonitor; +import it.fabioformosa.quartzmanager.services.SchedulerService; +import org.quartz.*; +import org.quartz.impl.triggers.SimpleTriggerImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.convert.ConversionService; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.Map; /** * This controller provides scheduler info about config and status. It provides * also methods to set new config and start/stop/resume the scheduler. * * @author Fabio.Formosa - * */ @RestController @RequestMapping("/quartz-manager/scheduler") @Api(value = "scheduler") public class SchedulerController { - private static final int MILLS_IN_A_DAY = 1000 * 60 * 60 * 24; - private static final int SEC_IN_A_DAY = 60 * 60 * 24; + private final Logger log = LoggerFactory.getLogger(SchedulerController.class); - private final Logger log = LoggerFactory.getLogger(SchedulerController.class); + private SchedulerService schedulerService; - @Resource - private Scheduler scheduler; + public SchedulerController(SchedulerService schedulerService, ConversionService conversionService) { + this.schedulerService = schedulerService; + this.conversionService = conversionService; + } - @Resource - private TriggerMonitor triggerMonitor; + // @Resource +// private Scheduler scheduler; - private long fromMillsIntervalToTriggerPerDay(long repeatIntervalInMills) { - return (int) Math.ceil(MILLS_IN_A_DAY / repeatIntervalInMills); + //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; + } + + public static SchedulerConfigParam fromSimpleTriggerToSchedulerConfigParam(SimpleTrigger simpleTrigger){ + int timesTriggered = simpleTrigger.getTimesTriggered(); + int maxCount = simpleTrigger.getRepeatCount() + 1; + long triggersPerDay = SchedulerService.fromMillsIntervalToTriggerPerDay(simpleTrigger.getRepeatInterval()); + return new SchedulerConfigParam(triggersPerDay, maxCount, timesTriggered); + } + + + + @GetMapping + public SchedulerDTO getScheduler() { + log.debug("SCHEDULER - GET Scheduler..."); + SchedulerDTO schedulerDTO = conversionService.convert(schedulerService.getScheduler(), SchedulerDTO.class); + return schedulerDTO; + } + + @GetMapping("/progress") + public TriggerStatus getProgressInfo() throws SchedulerException { + log.trace("SCHEDULER - GET PROGRESS INFO"); + TriggerStatus progress = new TriggerStatus(); + + SimpleTriggerImpl jobTrigger = (SimpleTriggerImpl) schedulerService.getOneSimpleTrigger().get(); + if (jobTrigger != null && jobTrigger.getJobKey() != null) { + progress.setJobKey(jobTrigger.getJobKey().getName()); + progress.setJobClass(jobTrigger.getClass().getSimpleName()); + progress.setTimesTriggered(jobTrigger.getTimesTriggered()); + progress.setRepeatCount(jobTrigger.getRepeatCount()); + progress.setFinalFireTime(jobTrigger.getFinalFireTime()); + progress.setNextFireTime(jobTrigger.getNextFireTime()); + progress.setPreviousFireTime(jobTrigger.getPreviousFireTime()); } - private int fromTriggerPerDayToMillsInterval(long triggerPerDay) { - return (int) Math.ceil(Long.valueOf(MILLS_IN_A_DAY) / triggerPerDay); // with ceil the triggerPerDay is a max value - } + return progress; + } - @SuppressWarnings("unused") - private int fromTriggerPerDayToSecInterval(long triggerPerDay) { - return (int) Math.ceil(Long.valueOf(SEC_IN_A_DAY) / triggerPerDay); - } + @GetMapping(value = "/status", produces = "application/json") + public Map getStatus() throws SchedulerException { + log.trace("SCHEDULER - GET STATUS"); + String schedulerState = ""; + if (schedulerService.getScheduler().isShutdown() || !schedulerService.getScheduler().isStarted()) + schedulerState = SchedulerStates.STOPPED.toString(); + else if (schedulerService.getScheduler().isStarted() && schedulerService.getScheduler().isInStandbyMode()) + schedulerState = SchedulerStates.PAUSED.toString(); + else + schedulerState = SchedulerStates.RUNNING.toString(); + return Collections.singletonMap("data", schedulerState.toLowerCase()); + } - @GetMapping("/config") - public SchedulerConfigParam getConfig() throws SchedulerException { - log.debug("SCHEDULER - GET CONFIG params"); + @GetMapping("/pause") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void pause() throws SchedulerException { + log.info("SCHEDULER - PAUSE COMMAND"); + schedulerService.getScheduler().standby(); + } - SimpleTrigger jobTrigger = (SimpleTrigger) scheduler.getTrigger(triggerMonitor.getTrigger().getKey()); - int maxCount = jobTrigger.getRepeatCount() + 1; - long triggersPerDay = fromMillsIntervalToTriggerPerDay(jobTrigger.getRepeatInterval()); +// @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; +// } - return new SchedulerConfigParam(triggersPerDay, maxCount); - } + @GetMapping("/resume") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void resume() throws SchedulerException { + log.info("SCHEDULER - RESUME COMMAND"); + schedulerService.getScheduler().start(); + } - @GetMapping("/progress") - public TriggerStatus getProgressInfo() throws SchedulerException { - log.trace("SCHEDULER - GET PROGRESS INFO"); - TriggerStatus progress = new TriggerStatus(); + @GetMapping("/run") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void run() throws SchedulerException { + log.info("SCHEDULER - START COMMAND"); + schedulerService.getScheduler().start(); + } - SimpleTriggerImpl jobTrigger = (SimpleTriggerImpl) scheduler.getTrigger(triggerMonitor.getTrigger().getKey()); - if (jobTrigger != null && jobTrigger.getJobKey() != null) { - progress.setJobKey(jobTrigger.getJobKey().getName()); - progress.setJobClass(jobTrigger.getClass().getSimpleName()); - progress.setTimesTriggered(jobTrigger.getTimesTriggered()); - progress.setRepeatCount(jobTrigger.getRepeatCount()); - progress.setFinalFireTime(jobTrigger.getFinalFireTime()); - progress.setNextFireTime(jobTrigger.getNextFireTime()); - progress.setPreviousFireTime(jobTrigger.getPreviousFireTime()); - } - - return progress; - } - - @GetMapping(produces = "application/json") - public Map getStatus() throws SchedulerException { - log.trace("SCHEDULER - GET STATUS"); - String schedulerState = ""; - if (scheduler.isShutdown() || !scheduler.isStarted()) - schedulerState = SchedulerStates.STOPPED.toString(); - else if (scheduler.isStarted() && scheduler.isInStandbyMode()) - schedulerState = SchedulerStates.PAUSED.toString(); - else - schedulerState = SchedulerStates.RUNNING.toString(); - return Collections.singletonMap("data", schedulerState.toLowerCase()); - } - - @GetMapping("/pause") - @ResponseStatus(HttpStatus.NO_CONTENT) - public void pause() throws SchedulerException { - log.info("SCHEDULER - PAUSE COMMAND"); - scheduler.standby(); - } - - @PostMapping("/config") - public SchedulerConfigParam postConfig(@RequestBody SchedulerConfigParam config) throws SchedulerException { - log.info("SCHEDULER - NEW CONFIG {}", config); - SimpleTrigger trigger = (SimpleTrigger) triggerMonitor.getTrigger(); - - TriggerBuilder triggerBuilder = trigger.getTriggerBuilder(); - - int intervalInMills = fromTriggerPerDayToMillsInterval(config.getTriggerPerDay()); - - Trigger newTrigger = triggerBuilder - .withSchedule( - SimpleScheduleBuilder.simpleSchedule() - .withIntervalInMilliseconds(intervalInMills) - .withRepeatCount(config.getMaxCount() - 1) - .withMisfireHandlingInstructionNextWithRemainingCount() - ) - .build(); - - scheduler.rescheduleJob(triggerMonitor.getTrigger().getKey(), newTrigger); - triggerMonitor.setTrigger(newTrigger); - return config; - } - - @GetMapping("/resume") - @ResponseStatus(HttpStatus.NO_CONTENT) - public void resume() throws SchedulerException { - log.info("SCHEDULER - RESUME COMMAND"); - scheduler.start(); - } - - @GetMapping("/run") - @ResponseStatus(HttpStatus.NO_CONTENT) - public void run() throws SchedulerException { - log.info("SCHEDULER - START COMMAND"); - scheduler.start(); - } - - @GetMapping("/stop") - @ResponseStatus(HttpStatus.NO_CONTENT) - public void stop() throws SchedulerException { - log.info("SCHEDULER - STOP COMMAND"); - scheduler.shutdown(true); - } + @GetMapping("/stop") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void stop() throws SchedulerException { + log.info("SCHEDULER - STOP COMMAND"); + schedulerService.getScheduler().shutdown(true); + } } 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 new file mode 100644 index 0000000..f3d8be3 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/controllers/TriggerController.java @@ -0,0 +1,72 @@ +package it.fabioformosa.quartzmanager.controllers; + +import io.swagger.annotations.Api; +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.springframework.beans.factory.annotation.Value; +import org.springframework.core.convert.ConversionService; +import org.springframework.web.bind.annotation.*; + +@Slf4j +@RequestMapping("/quartz-manager/triggers") +@RestController +@Api(value = "triggers") +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; + 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; + } + + @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() + ) + .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); + return newTriggerDTO; + } + + +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/converters/JobKeyToJobKeyDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/converters/JobKeyToJobKeyDTO.java new file mode 100644 index 0000000..8bfd485 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/converters/JobKeyToJobKeyDTO.java @@ -0,0 +1,15 @@ +package it.fabioformosa.quartzmanager.converters; + +import it.fabioformosa.metamorphosis.core.converters.AbstractBaseConverterToDTO; +import it.fabioformosa.quartzmanager.dto.JobKeyDTO; +import org.quartz.JobKey; +import org.springframework.stereotype.Component; + +@Component +public class JobKeyToJobKeyDTO extends AbstractBaseConverterToDTO { + @Override + protected void convert(JobKey source, JobKeyDTO target) { + target.setName(source.getName()); + target.setGroup(source.getGroup()); + } +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/converters/SchedulerToSchedulerDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/converters/SchedulerToSchedulerDTO.java new file mode 100644 index 0000000..fcc01a7 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/converters/SchedulerToSchedulerDTO.java @@ -0,0 +1,21 @@ +package it.fabioformosa.quartzmanager.converters; + +import it.fabioformosa.metamorphosis.core.converters.AbstractBaseConverterToDTO; +import it.fabioformosa.quartzmanager.dto.SchedulerDTO; +import lombok.SneakyThrows; +import org.quartz.Scheduler; +import org.quartz.impl.matchers.GroupMatcher; +import org.springframework.stereotype.Component; + +@Component +public class SchedulerToSchedulerDTO extends AbstractBaseConverterToDTO { + + @SneakyThrows + @Override + protected void convert(Scheduler source, SchedulerDTO target) { + target.setName(source.getSchedulerName()); + target.setInstanceId(source.getSchedulerInstanceId()); + target.setTriggerKeys(source.getTriggerKeys(GroupMatcher.anyTriggerGroup())); + } + +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/converters/TriggerKeyToTriggerKeyDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/converters/TriggerKeyToTriggerKeyDTO.java new file mode 100644 index 0000000..ec5e01e --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/converters/TriggerKeyToTriggerKeyDTO.java @@ -0,0 +1,16 @@ +package it.fabioformosa.quartzmanager.converters; + +import it.fabioformosa.metamorphosis.core.converters.AbstractBaseConverterToDTO; +import it.fabioformosa.quartzmanager.dto.TriggerKeyDTO; +import org.quartz.TriggerKey; +import org.springframework.stereotype.Component; + +@Component +public class TriggerKeyToTriggerKeyDTO extends AbstractBaseConverterToDTO { + + @Override + protected void convert(TriggerKey source, TriggerKeyDTO target) { + target.setName(source.getName()); + target.setGroup(source.getGroup()); + } +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/converters/TriggerToTriggerDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/converters/TriggerToTriggerDTO.java new file mode 100644 index 0000000..479be88 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/converters/TriggerToTriggerDTO.java @@ -0,0 +1,36 @@ +package it.fabioformosa.quartzmanager.converters; + +import it.fabioformosa.metamorphosis.core.converters.AbstractBaseConverterToDTO; +import it.fabioformosa.quartzmanager.dto.JobKeyDTO; +import it.fabioformosa.quartzmanager.dto.TriggerDTO; +import it.fabioformosa.quartzmanager.dto.TriggerKeyDTO; +import org.quartz.JobKey; +import org.quartz.Trigger; +import org.quartz.TriggerKey; +import org.springframework.stereotype.Component; + +@Component +public class TriggerToTriggerDTO extends AbstractBaseConverterToDTO { + + @Override + protected void convert(Trigger source, TriggerDTO target) { + TriggerKey triggerKey = source.getKey(); + TriggerKeyDTO triggerKeyDTO = conversionService.convert(triggerKey, TriggerKeyDTO.class); + target.setTriggerKeyDTO(triggerKeyDTO); + + target.setStartTime(source.getStartTime()); + target.setDescription(source.getDescription()); + target.setEndTime(source.getEndTime()); + target.setFinalFireTime(source.getFinalFireTime()); + target.setMisfireInstruction(source.getMisfireInstruction()); + target.setNextFireTime(source.getNextFireTime()); + target.setPriority(source.getPriority()); + target.setMayFireAgain(source.mayFireAgain()); + + JobKey jobKey = source.getJobKey(); + JobKeyDTO jobKeyDTO = conversionService.convert(jobKey, JobKeyDTO.class); + target.setJobKeyDTO(jobKeyDTO); + + } + +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/JobKeyDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/JobKeyDTO.java new file mode 100644 index 0000000..1a9bfc3 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/JobKeyDTO.java @@ -0,0 +1,22 @@ +package it.fabioformosa.quartzmanager.dto; + +public class JobKeyDTO { + private String name; + private String group; + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setGroup(String group) { + this.group = group; + } + + public String getGroup() { + return group; + } +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/SchedulerConfigParam.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/SchedulerConfigParam.java index 8caf0d1..60026ae 100644 --- a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/SchedulerConfigParam.java +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/SchedulerConfigParam.java @@ -1,40 +1,14 @@ package it.fabioformosa.quartzmanager.dto; -public class SchedulerConfigParam { +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +@NoArgsConstructor +@AllArgsConstructor +@Data +public class SchedulerConfigParam { public long triggerPerDay; public int maxCount; - - public SchedulerConfigParam() { - super(); - } - - public SchedulerConfigParam(long triggerPerDay, int maxCount) { - super(); - this.triggerPerDay = triggerPerDay; - this.maxCount = maxCount; - } - - public int getMaxCount() { - return maxCount; - } - - public long getTriggerPerDay() { - return triggerPerDay; - } - - public void setMaxCount(int maxCount) { - this.maxCount = maxCount; - } - - public void setTriggerPerDay(long triggerPerDay) { - this.triggerPerDay = triggerPerDay; - } - - @Override - public String toString() { - return "SchedulerConfigParam [triggerPerDay=" + triggerPerDay - + ", maxCount=" + maxCount + "]"; - } - + public int timesTriggered; } diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/SchedulerDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/SchedulerDTO.java new file mode 100644 index 0000000..7dca347 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/SchedulerDTO.java @@ -0,0 +1,35 @@ +package it.fabioformosa.quartzmanager.dto; + +import org.quartz.TriggerKey; + +import java.util.Set; + +public class SchedulerDTO { + private String name; + private String instanceId; + private Set triggerKeys; + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setInstanceId(String instanceId) { + this.instanceId = instanceId; + } + + public String getInstanceId() { + return instanceId; + } + + public void setTriggerKeys(Set triggerKeys) { + this.triggerKeys = triggerKeys; + } + + public Set getTriggerKeys() { + return triggerKeys; + } +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/TriggerDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/TriggerDTO.java new file mode 100644 index 0000000..ff41c22 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/TriggerDTO.java @@ -0,0 +1,23 @@ +package it.fabioformosa.quartzmanager.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@AllArgsConstructor +@NoArgsConstructor +@Data +public class TriggerDTO { + private TriggerKeyDTO triggerKeyDTO; + private int priority; + private Date startTime; + private String description; + private Date endTime; + private Date finalFireTime; + private int misfireInstruction; + private Date nextFireTime; + private JobKeyDTO jobKeyDTO; + private boolean mayFireAgain; +} diff --git a/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/TriggerKeyDTO.java b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/TriggerKeyDTO.java new file mode 100644 index 0000000..4a26e04 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/dto/TriggerKeyDTO.java @@ -0,0 +1,22 @@ +package it.fabioformosa.quartzmanager.dto; + +public class TriggerKeyDTO { + private String name; + private String group; + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setGroup(String group) { + this.group = group; + } + + public String getGroup() { + return group; + } +} 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 new file mode 100644 index 0000000..75f63d5 --- /dev/null +++ b/quartz-manager-parent/quartz-manager-starter-api/src/main/java/it/fabioformosa/quartzmanager/services/SchedulerService.java @@ -0,0 +1,60 @@ +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 org.quartz.impl.matchers.GroupMatcher; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class SchedulerService { + + public static final int MILLS_IN_A_DAY = 1000 * 60 * 60 * 24; + public static final int SEC_IN_A_DAY = 60 * 60 * 24; + + private Scheduler scheduler; + + public SchedulerService(Scheduler scheduler) { + this.scheduler = scheduler; + } + + public static int fromTriggerPerDayToMillsInterval(long triggerPerDay) { + return (int) Math.ceil(Long.valueOf(SchedulerService.MILLS_IN_A_DAY) / triggerPerDay); // with ceil the triggerPerDay is a max value + } + + public static int fromTriggerPerDayToSecInterval(long triggerPerDay) { + return (int) Math.ceil(Long.valueOf(SchedulerService.SEC_IN_A_DAY) / triggerPerDay); + } + + public static long fromMillsIntervalToTriggerPerDay(long repeatIntervalInMills) { + return (int) Math.ceil(MILLS_IN_A_DAY / repeatIntervalInMills); + } + + public Scheduler getScheduler() { + return scheduler; + } + + public Optional getTriggerByKey(String triggerKeyName) throws SchedulerException { + return scheduler.getTriggerKeys(GroupMatcher.anyGroup()).stream() + .filter(triggerKey -> triggerKey.getName().equals(triggerKeyName)) + .findFirst(); + } + + public Optional getOneSimpleTrigger() throws SchedulerException { + return getOneTriggerKey() + .map(Try.with(triggerKey -> scheduler.getTrigger(triggerKey))) + .filter(Try::isSuccess).map(Try::getSuccess) + .filter(trigger -> trigger instanceof SimpleTrigger) + .map(trigger -> (SimpleTrigger) trigger); + } + + public Optional getOneTriggerKey() throws SchedulerException { + return scheduler.getTriggerKeys(GroupMatcher.anyGroup()).stream() + .findFirst(); + } + +} 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 index 8690183..517bd29 100644 --- 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 @@ -1,69 +1,61 @@ -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(); - } - -} +package it.fabioformosa.quartzmanager.persistence; + +import it.fabioformosa.quartzmanager.common.properties.QuartzModuleProperties; +import liquibase.integration.spring.SpringLiquibase; +import lombok.Data; +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 javax.sql.DataSource; + +@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; + } + + @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-web-showcase/src/main/resources/logback.xml b/quartz-manager-parent/quartz-manager-web-showcase/src/main/resources/logback.xml index 413c274..96206fc 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 @@ -12,6 +12,9 @@ + + + @@ -23,4 +26,4 @@ - \ No newline at end of file +