📄 crontrigger.java
字号:
/* * Copyright James House (c) 2001-2004, * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: 1. * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. 2. Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */package org.quartz;import java.text.ParseException;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.SortedSet;import java.util.StringTokenizer;import java.util.TimeZone;import java.util.TreeSet;/** * <p> * A concrete <code>{@link Trigger}</code> that is used to fire a <code>{@link org.quartz.JobDetail}</code> * at given moments in time, defined with Unix 'cron-like' definitions. * </p> * * <p> * For those unfamiliar with "cron", this means being able to create a firing * schedule such as: "At 8:00am every Monday through Friday" or "At 1:30am * every last Friday of the month". * </p> * * <p> * A "Cron-Expression" is a string comprised of 6 or 7 fields separated by * white space. The 6 mandatory and 1 optional fields are as follows: <br> * * <table cellspacing="8"> * <tr> * <th align="left">Field Name</th> * <th align="left"> </th> * <th align="left">Allowed Values</th> * <th align="left"> </th> * <th align="left">Allowed Special Characters</th> * </tr> * <tr> * <td align="left"><code>Seconds</code></td> * <td align="left"> </th> * <td align="left"><code>0-59</code></td> * <td align="left"> </th> * <td align="left"><code>, - * /</code></td> * </tr> * <tr> * <td align="left"><code>Minutes</code></td> * <td align="left"> </th> * <td align="left"><code>0-59</code></td> * <td align="left"> </th> * <td align="left"><code>, - * /</code></td> * </tr> * <tr> * <td align="left"><code>Hours</code></td> * <td align="left"> </th> * <td align="left"><code>0-23</code></td> * <td align="left"> </th> * <td align="left"><code>, - * /</code></td> * </tr> * <tr> * <td align="left"><code>Day-of-month</code></td> * <td align="left"> </th> * <td align="left"><code>1-31</code></td> * <td align="left"> </th> * <td align="left"><code>, - * ? / L W C</code></td> * </tr> * <tr> * <td align="left"><code>Month</code></td> * <td align="left"> </th> * <td align="left"><code>1-12 or JAN-DEC</code></td> * <td align="left"> </th> * <td align="left"><code>, - * /</code></td> * </tr> * <tr> * <td align="left"><code>Day-of-Week</code></td> * <td align="left"> </th> * <td align="left"><code>1-7 or SUN-SAT</code></td> * <td align="left"> </th> * <td align="left"><code>, - * ? / L C #</code></td> * </tr> * <tr> * <td align="left"><code>Year (Optional)</code></td> * <td align="left"> </th> * <td align="left"><code>empty, 1970-2099</code></td> * <td align="left"> </th> * <td align="left"><code>, - * /</code></td> * </tr> * </table> * </p> * * <p> * The '*' character is used to specify all values. For example, "*" in the * minute field means "every minute". * </p> * * <p> * The '?' character is allowed for the day-of-month and day-of-week fields. It * is used to specify 'no specific value'. This is useful when you need to * specify something in one of the two fileds, but not the other. See the * examples below for clarification. * </p> * * <p> * The '-' character is used to specify ranges For example "10-12" in the hour * field means "the hours 10, 11 and 12". * </p> * * <p> * The ',' character is used to specify additional values. For example * "MON,WED,FRI" in the day-of-week field means "the days Monday, Wednesday, * and Friday". * </p> * * <p> * The '/' character is used to specify increments. For example "0/15" in the * seconds field means "the seconds 0, 15, 30, and 45". And "5/15" in the * seconds field means "the seconds 5, 20, 35, and 50". You can also specify * '/' after the '*' character - in this case '*' is equivalent to having '0' * before the '/'. * </p> * * <p> * The 'L' character is allowed for the day-of-month and day-of-week fields. * This character is short-hand for "last", but it has different meaning in * each of the two fields. For example, the value "L" in the day-of-month field * means "the last day of the month" - day 31 for January, day 28 for February * on non-leap years. If used in the day-of-week field by itself, it simply * means "7" or "SAT". But if used in the day-of-week field after another * value, it means "the last xxx day of the month" - for example "6L" means * "the last friday of the month". When using the 'L' option, it is important * not to specify lists, or ranges of values, as you'll get confusing results. * </p> * * <p> * The 'W' character is allowed for the day-of-month field. This character * is used to specify the weekday (Monday-Friday) nearest the given day. As an * example, if you were to specify "15W" as the value for the day-of-month * field, the meaning is: "the nearest weekday to the 15th of the month". So * if the 15th is a Saturday, the trigger will fire on Friday the 14th. If the * 15th is a Sunday, the trigger will fire on Monday the 16th. If the 15th is * a Tuesday, then it will fire on Tuesday the 15th. However if you specify * "1W" as the value for day-of-month, and the 1st is a Saturday, the trigger * will fire on Monday the 3rd, as it will not 'jump' over the boundary of a * month's days. The 'W' character can only be specified when the day-of-month * is a single day, not a range or list of days. * </p> * * <p> * The 'L' and 'W' characters can also be combined for the day-of-month * expression to yield 'LW', which translates to "last weekday of the month". * </p> * * <p> * The '#' character is allowed for the day-of-week field. This character is * used to specify "the nth" XXX day of the month. For example, the value of * "6#3" in the day-of-week field means the third Friday of the month (day 6 = * Friday and "#3" = the 3rd one in the month). Other examples: "2#1" = the * first Monday of the month and "4#5" = the fifth Wednesday of the month. Note * that if you specify "#5" and there is not 5 of the given day-of-week in the * month, then no firing will occur that month. * </p> * * <p> * The 'C' character is allowed for the day-of-month and day-of-week fields. * This character is short-hand for "calendar". This means values are * calculated against the associated calendar, if any. If no calendar is * associated, then it is equivalent to having an all-inclusive calendar. A * value of "5C" in the day-of-month field means "the first day included by the * calendar on or after the 5th". A value of "1C" in the day-of-week field * means "the first day included by the calendar on or after sunday". * </p> * * <p> * The legal characters and the names of months and days of the week are not * case sensitive. * </p> * * <p> * Here are some full examples: <br><table cellspacing="8"> * <tr> * <th align="left">Expression</th> * <th align="left"> </th> * <th align="left">Meaning</th> * </tr> * <tr> * <td align="left"><code>"0 0 12 * * ?"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 12pm (noon) every day</code></td> * </tr> * <tr> * <td align="left"><code>"0 15 10 ? * *"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 10:15am every day</code></td> * </tr> * <tr> * <td align="left"><code>"0 15 10 * * ?"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 10:15am every day</code></td> * </tr> * <tr> * <td align="left"><code>"0 15 10 * * ? *"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 10:15am every day</code></td> * </tr> * <tr> * <td align="left"><code>"0 15 10 * * ? 2005"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 10:15am every day during the year 2005</code> * </td> * </tr> * <tr> * <td align="left"><code>"0 * 14 * * ?"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire every minute starting at 2pm and ending at 2:59pm, every day</code> * </td> * </tr> * <tr> * <td align="left"><code>"0 0/5 14 * * ?"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day</code> * </td> * </tr> * <tr> * <td align="left"><code>"0 0/5 14,18 * * ?"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day</code> * </td> * </tr> * <tr> * <td align="left"><code>"0 0-5 14 * * ?"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire every minute starting at 2pm and ending at 2:05pm, every day</code> * </td> * </tr> * <tr> * <td align="left"><code>"0 10,44 14 ? 3 WED"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 2:10pm and at 2:44pm every Wednesday in the month of March.</code> * </td> * </tr> * <tr> * <td align="left"><code>"0 15 10 ? * MON-FRI"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday</code> * </td> * </tr> * <tr> * <td align="left"><code>"0 15 10 15 * ?"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 10:15am on the 15th day of every month</code> * </td> * </tr> * <tr> * <td align="left"><code>"0 15 10 L * ?"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 10:15am on the last day of every month</code> * </td> * </tr> * <tr> * <td align="left"><code>"0 15 10 ? * 6L"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 10:15am on the last Friday of every month</code> * </td> * </tr> * <tr> * <td align="left"><code>"0 15 10 ? * 6L"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 10:15am on the last Friday of every month</code> * </td> * </tr> * <tr> * <td align="left"><code>"0 15 10 ? * 6L 2002-2005"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005</code> * </td> * </tr> * <tr> * <td align="left"><code>"0 15 10 ? * 6#3"</code></td> * <td align="left"> </th> * <td align="left"><code>Fire at 10:15am on the third Friday of every month</code> * </td> * </tr> * </table> * </p> * * <p> * Pay attention to the effects of '?' and '*' in the day-of-week and * day-of-month fields! * </p> * * <p> * <b>NOTES:</b> * <ul> * <li>Support for the features described for the 'C' character is not * complete.</li> * <li>Support for specifying both a day-of-week and a day-of-month value is * not complete (you'll need to use the '?' character in on of these fields). * </li> * <li>Be careful when setting fire times between mid-night and 1:00 AM - * "daylight savings" can cause a skip or a repeat depending on whether the * time moves back or jumps forward.</li> * </ul> * </p> * * @see Trigger * @see SimpleTrigger * * @author Sharada Jambula, James House * @author Contributions from Mads Henderson */public class CronTrigger extends Trigger { /* * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * Constants. * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /** * <p> * Instructs the <code>{@link Scheduler}</code> that upon a mis-fire * situation, the <code>{@link CronTrigger}</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 CronTrigger}</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; /* * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * Data members. * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ protected static final int SECOND = 0; protected static final int MINUTE = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -