in jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/scheduler/BaseTimerJobScheduler.java [223:251]
private PublisherBuilder<JobDetails> handleInternalSchedule(JobDetails job, boolean onStart) {
unregisterScheduledJob(job);
switch (job.getStatus()) {
case SCHEDULED:
Duration delay = calculateRawDelay(DateUtil.fromDate(job.getTrigger().hasNextFireTime()));
if (delay.isNegative() && onStart && !forceExecuteExpiredJobsOnServiceStart) {
return ReactiveStreams.fromCompletionStage(handleExpiredJob(job));
} else {
// other cases of potential overdue are because of slow processing of the jobs service, or the user
// configured to fire overdue triggers at service startup. Always schedule.
PublisherBuilder<JobDetails> preSchedule;
if (job.getScheduledId() != null) {
// cancel the existing timer if any.
preSchedule = ReactiveStreams.fromPublisher(doCancel(job)).flatMap(jobHandle -> ReactiveStreams.of(job));
} else {
preSchedule = ReactiveStreams.of(job);
}
return preSchedule.flatMap(j -> scheduleRegistering(job, job.getTrigger()))
.map(handle -> jobWithStatusAndHandle(job, JobStatus.SCHEDULED, handle))
.map(scheduledJob -> jobRepository.save(scheduledJob))
.flatMapCompletionStage(p -> p);
}
case RETRY:
return handleRetry(CompletableFuture.completedFuture(job));
default:
// by definition there are no more cases, only SCHEDULED and RETRY cases are picked by the loader.
return ReactiveStreams.of(job);
}
}