private PublisherBuilder handleInternalSchedule()

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);
        }
    }