dropwizard-jobs/dropwizard-jobs

View on GitHub
dropwizard-jobs-core/src/main/java/io/dropwizard/jobs/scheduler/OnCronScheduler.java

Summary

Maintainability
A
0 mins
Test Coverage
package io.dropwizard.jobs.scheduler;

import io.dropwizard.jobs.Job;
import io.dropwizard.jobs.JobConfiguration;
import io.dropwizard.jobs.JobMediator;
import io.dropwizard.jobs.ScheduledJob;
import io.dropwizard.jobs.annotations.On;
import org.apache.commons.lang3.StringUtils;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobKey;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;

import java.time.ZoneId;
import java.util.TimeZone;
import java.util.stream.Stream;

public class OnCronScheduler extends EveryScheduler {

    private final CronExpressionParser cronExpressionParser;

    public OnCronScheduler(JobMediator mediator) {
        super(mediator);
        JobConfiguration configuration = mediator.getConfiguration();
        this.cronExpressionParser = new CronExpressionParser(configuration);
    }

    protected Stream<ScheduledJob> scheduledJobs() {
        return mediator.getJobs()
                .allOnCron()
                .map(job -> {

                    Class<? extends Job> clazz = job.getClass();
                    On onAnnotation = clazz.getAnnotation(On.class);
                    String value = onAnnotation.value();
                    String cronExpression = durationOrPlainExpression(value, clazz);

                    boolean requestRecovery = onAnnotation.requestRecovery();
                    boolean storeDurably = onAnnotation.storeDurably();

                    CronScheduleBuilder scheduleBuilder = cronExpressionParser.parse(cronExpression);

                    String timeZoneStr = onAnnotation.timeZone();
                    applyTimezone(timeZoneStr, scheduleBuilder);

                    On.MisfirePolicy misfirePolicy = onAnnotation.misfirePolicy();
                    applyMisfirePolicy(misfirePolicy, scheduleBuilder);

                    int priority = onAnnotation.priority();
                    Trigger trigger = TriggerBuilder.newTrigger()
                            .withSchedule(scheduleBuilder)
                            .withPriority(priority)
                            .build();

                    // ensure that only one instance of each job is scheduled
                    JobKey jobKey = createJobKey(onAnnotation.jobName(), job);

                    String message = String.format("    %-21s %s", cronExpression, jobKey.toString());
                    return new ScheduledJob(jobKey, clazz, trigger, requestRecovery, storeDurably, message);
                });
    }

    private void applyTimezone(String timeZoneStr, CronScheduleBuilder scheduleBuilder) {
        if (StringUtils.isNotBlank(timeZoneStr)) {
            TimeZone timeZone = TimeZone.getTimeZone(ZoneId.of(timeZoneStr));
            scheduleBuilder.inTimeZone(timeZone);
        }
    }

    private void applyMisfirePolicy(On.MisfirePolicy misfirePolicy, CronScheduleBuilder scheduleBuilder) {
        if (misfirePolicy == On.MisfirePolicy.IGNORE_MISFIRES)
            scheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires();
        else if (misfirePolicy == On.MisfirePolicy.DO_NOTHING)
            scheduleBuilder.withMisfireHandlingInstructionDoNothing();
        else if (misfirePolicy == On.MisfirePolicy.FIRE_AND_PROCEED)
            scheduleBuilder.withMisfireHandlingInstructionFireAndProceed();
    }


}