Skip to content

Instantly share code, notes, and snippets.

@ern
Last active June 17, 2016 21:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ern/12c281a57579d19a1b5d4c79423133d5 to your computer and use it in GitHub Desktop.
Save ern/12c281a57579d19a1b5d4c79423133d5 to your computer and use it in GitHub Desktop.
Cron Triggers
<h1>CronTrigger Tutorial</h1>
<h2>Introduction</h2>
<p><tt>cron</tt> is a UNIX tool that has been around for a long time, so its scheduling capabilities are powerful
and proven. The <tt>CronTrigger</tt> class is based on the scheduling capabilities of cron.</p>
<p><tt>CronTrigger</tt> uses “cron expressions”, which are able to create firing schedules such as: “At 8:00am every
Monday through Friday” or “At 1:30am every last Friday of the month”.</p>
<h2>Format</h2>
<p>A cron expression is a string comprised of 6 or 7 fields separated by white space. Fields can contain any of the
allowed values, along with various combinations of the allowed special characters for that field. The fields are as
follows:</p>
<table cellpadding="3" cellspacing="1">
<tbody>
<tr>
<th>Field Name</th>
<th>Mandatory</th>
<th>Allowed Values</th>
<th>Allowed Special Characters</th>
</tr>
<tr>
<td>Seconds</td>
<td>YES</td>
<td>0-59</td>
<td>, - * /</td>
</tr>
<tr>
<td>Minutes</td>
<td>YES</td>
<td>0-59</td>
<td>, - * /</td>
</tr>
<tr>
<td>Hours</td>
<td>YES</td>
<td>0-23</td>
<td>, - * /</td>
</tr>
<tr>
<td>Day of month</td>
<td>YES</td>
<td>1-31</td>
<td>, - * ? / L W<br clear="all">
</td>
</tr>
<tr>
<td>Month</td>
<td>YES</td>
<td>1-12 or JAN-DEC</td>
<td>, - * /</td>
</tr>
<tr>
<td>Day of week</td>
<td>YES</td>
<td>1-7 or SUN-SAT</td>
<td>, - * ? / L #</td>
</tr>
<tr>
<td>Year</td>
<td>NO</td>
<td>empty, 1970-2099</td>
<td>, - * /</td>
</tr>
</tbody>
</table>
<p>So cron expressions can be as simple as this: <tt>* * * * ? *</tt></p>
<p>or more complex, like this: <tt>0/5 14,18,3-39,52 * ? JAN,MAR,SEP MON-FRI 2002-2010</tt></p>
<h2>Special characters</h2>
<ul>
<li>
<p><tt><strong>*</strong></tt> (<em>“all values”</em>) - used to select all values within a field. For example, “<strong>*</strong>”
in the minute field means <em>“every minute”</em>.</p>
</li>
<li>
<p><tt><strong>?</strong></tt> (<em>“no specific value”</em>) - useful when you need to specify something in one of the
two fields in which the character is allowed, but not the other. For example, if I want my trigger to fire on a
particular day of the month (say, the 10th), but don’t care what day of the week that happens to be, I would put
“10” in the day-of-month field, and “?” in the day-of-week field. See the examples below for clarification.</p>
</li>
<li>
<p><tt><strong>-</strong></tt> - used to specify ranges. For example, “10-12” in the hour field means <em>“the
hours 10, 11 and 12”</em>.</p>
</li>
<li>
<p><tt><strong>,</strong></tt> - used to specify additional values. For example, “MON,WED,FRI” in the day-of-week
field means <em>“the days Monday, Wednesday, and Friday”</em>.</p>
</li>
<li>
<p><tt><strong>/</strong></tt> - used to specify increments. For example, “0/15” in the seconds field means <em>“the
seconds 0, 15, 30, and 45”</em>. And “5/15” in the seconds field means <em>“the seconds 5, 20, 35, and 50”</em>. You can
also specify ‘/’ after the ‘<strong>’ character - in this case ‘</strong>’ is equivalent to having ‘0’ before the ‘/’. ‘1/3’
in the day-of-month field means <em>“fire every 3 days starting on the first day of the month”</em>.</p>
</li>
<li>
<p><tt><strong>L</strong></tt> (<em>“last”</em>) - has different meaning in each of the two fields in which it is
allowed. For example, the value “L” in the day-of-month field means <em>“the last day of the month”</em> - 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 <em>“the last xxx day of the
month”</em> - for example “6L” means <em>“the last friday of the month”</em>. You can also specify an offset
from the last day of the month, such as “L-3” which would mean the third-to-last day of the calendar month.
<em>When using the ‘L’ option, it is important not to specify lists, or ranges of values, as you’ll get
confusing/unexpected results.</em></p>
</li>
<li>
<p><tt><strong>W</strong></tt> (<em>“weekday”</em>) - 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: <em>“the
nearest weekday to the 15th of the month”</em>. 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>
</li>
</ul>
<blockquote>
The 'L' and 'W' characters can also be combined in the day-of-month field to yield 'LW', which
translates to *"last weekday of the month"*.
</blockquote>
<ul>
<li><tt><strong>#</strong></tt> - used to specify “the nth” XXX day of the month. For example, the value of “6#3”
in the day-of-week field means <em>“the third Friday of the month”</em> (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.</li>
</ul>
<blockquote>
The legal characters and the names of months and days of the week are not case sensitive. <tt>MON</tt>
is the same as <tt>mon</tt>.
</blockquote>
<h2>Examples</h2>
<p>Here are some full examples:</p>
<table cellpadding="3" cellspacing="1">
<tbody>
<tr>
<td width="200">**Expression**</td>
<td>**Meaning**</td>
</tr>
<tr>
<td><tt>0 0 12 * * ?</tt></td>
<td>Fire at 12pm (noon) every day</td>
</tr>
<tr>
<td><tt>0 15 10 * * ? 2005</tt></td>
<td>Fire at 10:15am every day during the year 2005</td>
</tr>
<tr>
<td><tt>0 * 14 * * ?</tt></td>
<td>Fire every minute starting at 2pm and ending at 2:59pm, every day</td>
</tr>
<tr>
<td><tt>0 0/5 14 * * ?</tt></td>
<td>Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day</td>
</tr>
<tr>
<td><tt>0 0/5 14,18 * * ?</tt></td>
<td>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</td>
</tr>
<tr>
<td><tt>0 0-5 14 * * ?</tt></td>
<td>Fire every minute starting at 2pm and ending at 2:05pm, every day</td>
</tr>
<tr>
<td><tt>0 10,44 14 ? 3 WED</tt></td>
<td>Fire at 2:10pm and at 2:44pm every Wednesday in the month of March.</td>
</tr>
<tr>
<td><tt>0 15 10 ? * MON-FRI</tt></td>
<td>Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday</td>
</tr>
<tr>
<td><tt>0 15 10 15 * ?</tt></td>
<td>Fire at 10:15am on the 15th day of every month</td>
</tr>
<tr>
<td><tt>0 15 10 L * ?</tt></td>
<td>Fire at 10:15am on the last day of every month</td>
</tr>
<tr>
<td><tt>0 15 10 L-2 * ?</tt></td>
<td>Fire at 10:15am on the 2nd-to-last last day of every month</td>
</tr>
<tr>
<td><tt>0 11 11 11 11 ?</tt></td>
<td>Fire every November 11th at 11:11am.</td>
</tr>
</tbody>
</table>
<blockquote>
Pay attention to the effects of '?' and '*' in the day-of-week and day-of-month fields!
</blockquote>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment