/* * All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy * of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * */ package org.quartz; import org.quartz.impl.triggers.SimpleTriggerImpl; import org.quartz.spi.MutableTrigger; /** * <code>SimpleScheduleBuilder</code> is a {@link ScheduleBuilder} * that defines strict/literal interval-based schedules for * <code>Trigger</code>s. * * <p>Quartz provides a builder-style API for constructing scheduling-related * entities via a Domain-Specific Language (DSL). The DSL can best be * utilized through the usage of static imports of the methods on the classes * <code>TriggerBuilder</code>, <code>JobBuilder</code>, * <code>DateBuilder</code>, <code>JobKey</code>, <code>TriggerKey</code> * and the various <code>ScheduleBuilder</code> implementations.</p> * * <p>Client code can then use the DSL to write code such as this:</p> * <pre> * JobDetail job = newJob(MyJob.class) * .withIdentity("myJob") * .build(); * * Trigger trigger = newTrigger() * .withIdentity(triggerKey("myTrigger", "myTriggerGroup")) * .withSchedule(simpleSchedule() * .withIntervalInHours(1) * .repeatForever()) * .startAt(futureDate(10, MINUTES)) * .build(); * * scheduler.scheduleJob(job, trigger); * <pre> * * @see SimpleTrigger * @see CalendarIntervalScheduleBuilder * @see CronScheduleBuilder * @see ScheduleBuilder * @see TriggerBuilder */ public class SimpleScheduleBuilder extends ScheduleBuilder<SimpleTrigger> { private long interval = 0; private int repeatCount = 0; private int misfireInstruction = SimpleTrigger.MISFIRE_INSTRUCTION_SMART_POLICY; protected SimpleScheduleBuilder() { } /** * Create a SimpleScheduleBuilder. * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder simpleSchedule() { return new SimpleScheduleBuilder(); } /** * Create a SimpleScheduleBuilder set to repeat forever with a 1 minute interval. * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder repeatMinutelyForever() { return simpleSchedule() .withIntervalInMinutes(1) .repeatForever(); } /** * Create a SimpleScheduleBuilder set to repeat forever with an interval * of the given number of minutes. * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder repeatMinutelyForever(int minutes) { return simpleSchedule() .withIntervalInMinutes(minutes) .repeatForever(); } /** * Create a SimpleScheduleBuilder set to repeat forever with a 1 second interval. * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder repeatSecondlyForever() { return simpleSchedule() .withIntervalInSeconds(1) .repeatForever(); } /** * Create a SimpleScheduleBuilder set to repeat forever with an interval * of the given number of seconds. * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder repeatSecondlyForever(int seconds) { return simpleSchedule() .withIntervalInSeconds(seconds) .repeatForever(); } /** * Create a SimpleScheduleBuilder set to repeat forever with a 1 hour interval. * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder repeatHourlyForever() { return simpleSchedule() .withIntervalInHours(1) .repeatForever(); } /** * Create a SimpleScheduleBuilder set to repeat forever with an interval * of the given number of hours. * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder repeatHourlyForever(int hours) { return simpleSchedule() .withIntervalInHours(hours) .repeatForever(); } /** * Create a SimpleScheduleBuilder set to repeat the given number * of times - 1 with a 1 minute interval. * * <p>Note: Total count = 1 (at start time) + repeat count</p> * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder repeatMinutelyForTotalCount(int count) { if(count < 1) throw new IllegalArgumentException("Total count of firings must be at least one! Given count: " + count); return simpleSchedule() .withIntervalInMinutes(1) .withRepeatCount(count - 1); } /** * Create a SimpleScheduleBuilder set to repeat the given number * of times - 1 with an interval of the given number of minutes. * * <p>Note: Total count = 1 (at start time) + repeat count</p> * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder repeatMinutelyForTotalCount(int count, int minutes) { if(count < 1) throw new IllegalArgumentException("Total count of firings must be at least one! Given count: " + count); return simpleSchedule() .withIntervalInMinutes(minutes) .withRepeatCount(count - 1); } /** * Create a SimpleScheduleBuilder set to repeat the given number * of times - 1 with a 1 second interval. * * <p>Note: Total count = 1 (at start time) + repeat count</p> * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder repeatSecondlyForTotalCount(int count) { if(count < 1) throw new IllegalArgumentException("Total count of firings must be at least one! Given count: " + count); return simpleSchedule() .withIntervalInSeconds(1) .withRepeatCount(count - 1); } /** * Create a SimpleScheduleBuilder set to repeat the given number * of times - 1 with an interval of the given number of seconds. * * <p>Note: Total count = 1 (at start time) + repeat count</p> * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder repeatSecondlyForTotalCount(int count, int seconds) { if(count < 1) throw new IllegalArgumentException("Total count of firings must be at least one! Given count: " + count); return simpleSchedule() .withIntervalInSeconds(seconds) .withRepeatCount(count - 1); } /** * Create a SimpleScheduleBuilder set to repeat the given number * of times - 1 with a 1 hour interval. * * <p>Note: Total count = 1 (at start time) + repeat count</p> * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder repeatHourlyForTotalCount(int count) { if(count < 1) throw new IllegalArgumentException("Total count of firings must be at least one! Given count: " + count); return simpleSchedule() .withIntervalInHours(1) .withRepeatCount(count - 1); } /** * Create a SimpleScheduleBuilder set to repeat the given number * of times - 1 with an interval of the given number of hours. * * <p>Note: Total count = 1 (at start time) + repeat count</p> * * @return the new SimpleScheduleBuilder */ public static SimpleScheduleBuilder repeatHourlyForTotalCount(int count, int hours) { if(count < 1) throw new IllegalArgumentException("Total count of firings must be at least one! Given count: " + count); return simpleSchedule() .withIntervalInHours(hours) .withRepeatCount(count - 1); } /** * Build the actual Trigger -- NOT intended to be invoked by end users, * but will rather be invoked by a TriggerBuilder which this * ScheduleBuilder is given to. * * @see TriggerBuilder#withSchedule(ScheduleBuilder) */ @Override public MutableTrigger build() { SimpleTriggerImpl st = new SimpleTriggerImpl(); st.setRepeatInterval(interval); st.setRepeatCount(repeatCount); st.setMisfireInstruction(misfireInstruction); return st; } /** * Specify a repeat interval in milliseconds. * * @param intervalInMillis the number of seconds at which the trigger should repeat. * @return the updated SimpleScheduleBuilder * @see SimpleTrigger#getRepeatInterval() * @see #withRepeatCount(int) */ public SimpleScheduleBuilder withIntervalInMilliseconds(long intervalInMillis) { this.interval = intervalInMillis; return this; } /** * Specify a repeat interval in seconds - which will then be multiplied * by 1000 to produce milliseconds. * * @param intervalInSeconds the number of seconds at which the trigger should repeat. * @return the updated SimpleScheduleBuilder * @see SimpleTrigger#getRepeatInterval() * @see #withRepeatCount(int) */ public SimpleScheduleBuilder withIntervalInSeconds(int intervalInSeconds) { this.interval = intervalInSeconds * 1000L; return this; } /** * Specify a repeat interval in minutes - which will then be multiplied * by 60 * 1000 to produce milliseconds. * * @param intervalInMinutes the number of seconds at which the trigger should repeat. * @return the updated SimpleScheduleBuilder * @see SimpleTrigger#getRepeatInterval() * @see #withRepeatCount(int) */ public SimpleScheduleBuilder withIntervalInMinutes(int intervalInMinutes) { this.interval = intervalInMinutes * DateBuilder.MILLISECONDS_IN_MINUTE; return this; } /** * Specify a repeat interval in minutes - which will then be multiplied * by 60 * 60 * 1000 to produce milliseconds. * * @param intervalInHours the number of seconds at which the trigger should repeat. * @return the updated SimpleScheduleBuilder * @see SimpleTrigger#getRepeatInterval() * @see #withRepeatCount(int) */ public SimpleScheduleBuilder withIntervalInHours(int intervalInHours) { this.interval = intervalInHours * DateBuilder.MILLISECONDS_IN_HOUR; return this; } /** * Specify a the number of time the trigger will repeat - total number of * firings will be this number + 1. * * @param triggerRepeatCount the number of seconds at which the trigger should repeat. * @return the updated SimpleScheduleBuilder * @see SimpleTrigger#getRepeatCount() * @see #repeatForever() */ public SimpleScheduleBuilder withRepeatCount(int triggerRepeatCount) { this.repeatCount = triggerRepeatCount; return this; } /** * Specify that the trigger will repeat indefinitely. * * @return the updated SimpleScheduleBuilder * @see SimpleTrigger#getRepeatCount() * @see SimpleTrigger#REPEAT_INDEFINITELY * @see #withIntervalInMilliseconds(long) * @see #withIntervalInSeconds(int) * @see #withIntervalInMinutes(int) * @see #withIntervalInHours(int) */ public SimpleScheduleBuilder repeatForever() { this.repeatCount = SimpleTrigger.REPEAT_INDEFINITELY; return this; } /** * If the Trigger misfires, use the * {@link Trigger#MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY} instruction. * * @return the updated CronScheduleBuilder * @see Trigger#MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY */ public SimpleScheduleBuilder withMisfireHandlingInstructionIgnoreMisfires() { misfireInstruction = Trigger.MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY; return this; } /** * If the Trigger misfires, use the * {@link SimpleTrigger#MISFIRE_INSTRUCTION_FIRE_NOW} instruction. * * @return the updated SimpleScheduleBuilder * @see SimpleTrigger#MISFIRE_INSTRUCTION_FIRE_NOW */ public SimpleScheduleBuilder withMisfireHandlingInstructionFireNow() { misfireInstruction = SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW; return this; } /** * If the Trigger misfires, use the * {@link SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT} instruction. * * @return the updated SimpleScheduleBuilder * @see SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT */ public SimpleScheduleBuilder withMisfireHandlingInstructionNextWithExistingCount() { misfireInstruction = SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT; return this; } /** * If the Trigger misfires, use the * {@link SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT} instruction. * * @return the updated SimpleScheduleBuilder * @see SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT */ public SimpleScheduleBuilder withMisfireHandlingInstructionNextWithRemainingCount() { misfireInstruction = SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT; return this; } /** * If the Trigger misfires, use the * {@link SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT} instruction. * * @return the updated SimpleScheduleBuilder * @see SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT */ public SimpleScheduleBuilder withMisfireHandlingInstructionNowWithExistingCount() { misfireInstruction = SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT; return this; } /** * If the Trigger misfires, use the * {@link SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT} instruction. * * @return the updated SimpleScheduleBuilder * @see SimpleTrigger#MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT */ public SimpleScheduleBuilder withMisfireHandlingInstructionNowWithRemainingCount() { misfireInstruction = SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT; return this; } }