/* * 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 java.util.Calendar; import java.util.TimeZone; import org.quartz.DateBuilder.IntervalUnit; /** * A concrete <code>{@link Trigger}</code> that is used to fire a <code>{@link org.quartz.JobDetail}</code> * based upon repeating calendar time intervals. * * <p>The trigger will fire every N (see {@link #getRepeatInterval()} ) units of calendar time * (see {@link #getRepeatIntervalUnit()}) as specified in the trigger's definition. * This trigger can achieve schedules that are not possible with {@link SimpleTrigger} (e.g * because months are not a fixed number of seconds) or {@link CronTrigger} (e.g. because * "every 5 months" is not an even divisor of 12).</p> * * <p>If you use an interval unit of <code>MONTH</code> then care should be taken when setting * a <code>startTime</code> value that is on a day near the end of the month. For example, * if you choose a start time that occurs on January 31st, and have a trigger with unit * <code>MONTH</code> and interval <code>1</code>, then the next fire time will be February 28th, * and the next time after that will be March 28th - and essentially each subsequent firing will * occur on the 28th of the month, even if a 31st day exists. If you want a trigger that always * fires on the last day of the month - regardless of the number of days in the month, * you should use <code>CronTrigger</code>.</p> * * @see TriggerBuilder * @see CalendarIntervalScheduleBuilder * @see SimpleScheduleBuilder * @see CronScheduleBuilder * * @author James House */ public interface CalendarIntervalTrigger extends Trigger { /** * <p> * Instructs the <code>{@link Scheduler}</code> that upon a mis-fire * situation, the <code>{@link CalendarIntervalTrigger}</code> wants to be * fired now by <code>Scheduler</code>. * </p> */ public static final int MISFIRE_INSTRUCTION_FIRE_ONCE_NOW = 1; /** * <p> * Instructs the <code>{@link Scheduler}</code> that upon a mis-fire * situation, the <code>{@link CalendarIntervalTrigger}</code> wants to have it's * next-fire-time updated to the next time in the schedule after the * current time (taking into account any associated <code>{@link Calendar}</code>, * but it does not want to be fired now. * </p> */ public static final int MISFIRE_INSTRUCTION_DO_NOTHING = 2; /** * <p>Get the interval unit - the time unit on with the interval applies.</p> */ public IntervalUnit getRepeatIntervalUnit(); /** * <p> * Get the the time interval that will be added to the <code>DateIntervalTrigger</code>'s * fire time (in the set repeat interval unit) in order to calculate the time of the * next trigger repeat. * </p> */ public int getRepeatInterval(); /** * <p> * Get the number of times the <code>DateIntervalTrigger</code> has already * fired. * </p> */ public int getTimesTriggered(); /** * <p> * Gets the time zone within which time calculations related to this * trigger will be performed. * </p> * * <p> * If null, the system default TimeZone will be used. * </p> */ public TimeZone getTimeZone(); /** * If intervals are a day or greater, this property (set to true) will * cause the firing of the trigger to always occur at the same time of day, * (the time of day of the startTime) regardless of daylight saving time * transitions. Default value is false. * * <p> * For example, without the property set, your trigger may have a start * time of 9:00 am on March 1st, and a repeat interval of 2 days. But * after the daylight saving transition occurs, the trigger may start * firing at 8:00 am every other day. * </p> * * <p> * If however, the time of day does not exist on a given day to fire * (e.g. 2:00 am in the United States on the days of daylight saving * transition), the trigger will go ahead and fire one hour off on * that day, and then resume the normal hour on other days. If * you wish for the trigger to never fire at the "wrong" hour, then * you should set the property skipDayIfHourDoesNotExist. * </p> * * @see #isSkipDayIfHourDoesNotExist() * @see #getStartTime() * @see #getTimeZone() */ public boolean isPreserveHourOfDayAcrossDaylightSavings(); /** * If intervals are a day or greater, and * preserveHourOfDayAcrossDaylightSavings property is set to true, and the * hour of the day does not exist on a given day for which the trigger * would fire, the day will be skipped and the trigger advanced a second * interval if this property is set to true. Defaults to false. * * <p> * <b>CAUTION!</b> If you enable this property, and your hour of day happens * to be that of daylight savings transition (e.g. 2:00 am in the United * States) and the trigger's interval would have had the trigger fire on * that day, then you may actually completely miss a firing on the day of * transition if that hour of day does not exist on that day! In such a * case the next fire time of the trigger will be computed as double (if * the interval is 2 days, then a span of 4 days between firings will * occur). * </p> * * @see #isPreserveHourOfDayAcrossDaylightSavings() */ public boolean isSkipDayIfHourDoesNotExist(); TriggerBuilder<CalendarIntervalTrigger> getTriggerBuilder(); }