Skip to content

Cron Scheduling

Akram El Assas edited this page Aug 7, 2023 · 2 revisions

Introduction

cron is a UNIX tool that has been around for a long time, so its scheduling capabilities are powerful and proven. Wexflow provides the ability to create workflows that start depending on a cron expression.

Cron workflows are often more useful than trigger or periodic workflows, if you need a job-firing schedule that recurs based on calendar-like notions, rather than on the exactly specified intervals.

With cron workflows, you can specify firing-schedules such as "every Friday at noon", or "every weekday and 9:30 am", or even "every 5 minutes between 9:00 am and 10:00 am on every Monday, Wednesday and Friday".

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:

*    *    *    *    *    *     *  
┬    ┬    ┬    ┬    ┬    ┬     ┬
│    │    │    │    │    │     └ Year (1970 - 2099) (Optional) (Allowed Special Characters: , - * /)
│    │    │    │    │    └────── Day of week (1 - 7) (Sunday=1) (Allowed Special Characters: , - * ? / L #)
│    │    │    │    └─────────── Month (1 - 12) (Jan=1) (Allowed Special Characters: , - * /)
│    │    │    └──────────────── Day of month (1 - 31) (Allowed Special Characters: , - * ? / L W)
│    │    └───────────────────── Hours (0 - 23) (Allowed Special Characters: , - * /)
│    └────────────────────────── Minutes (0 - 59) (Allowed Special Characters: , - * /)
└─────────────────────────────── Seconds (0 - 59) (Allowed Special Characters: , - * /)

So cron expressions can be as simple as this: * * * * ? *

or more complex, like this: 0/5 14,18,3-39,52 * ? JAN,MAR,SEP MON-FRI 2002-2010

Pay attention

Wexflow is using Quartz.NET cron expressions. UNIX Cron expressions and Quartz ones are different. Simply:

  • In Unix:
(minute, hour, day, month, day_of_week, year)
  • In Quartz:
(second, minute, hour, day, month, day_of_week, year)

Special characters

  • "" (“all values”) - used to select all values within a field. For example, "" in the minute field means * “every minute”.
  • ? (“no specific value”) - 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 workflow 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.
  • - used to specify ranges. For example, “10-12” in the hour field means “the hours 10, 11 and 12”.
  • , used to specify additional values. For example, “MON,WED,FRI” in the day-of-week field means “the days Monday, Wednesday, and Friday”.
  • / - 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 ‘/’. ‘1/3’ in the day-of-month field means “fire every 3 days starting on the first day of the month”.
  • L (“last”) - 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 “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”. 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. When using the ‘L’ option, it is important not to specify lists, or ranges of values, as you’ll get confusing/unexpected results.
  • W (“weekday”) - 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 workflow will fire on Friday the 14th. If the 15th is a Sunday, the workflow 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 workflow 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. ** 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”.
  • # 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. ** The legal characters and the names of months and days of the week are not case sensitive. MON is the same as mon.

Examples

Here are some examples:

0 0 12 * * ?	         Fire at 12pm (noon) every day.
0 15 10 ? * *	         Fire at 10:15am every day.
0 15 10 * * ?	         Fire at 10:15am every day.
0 15 10 * * ? *	         Fire at 10:15am every day.
0 15 10 * * ? 2019       Fire at 10:15am every day during the year 2019.
0 * 14 * * ?	         Fire every minute starting at 2pm and ending at 2:59pm, every day.
0 0/5 14 * * ?	         Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day.
0 0/5 14,18 * * ?        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.
0 0-5 14 * * ?	         Fire every minute starting at 2pm and ending at 2:05pm, every day.
0 10,44 14 ? 3 WED       Fire at 2:10pm and at 2:44pm every Wednesday in the month of March.
0 15 10 ? * MON-FRI      Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday.
0 15 10 15 * ?	         Fire at 10:15am on the 15th day of every month.
0 15 10 L * ?	         Fire at 10:15am on the last day of every month.
0 15 10 L-2 * ?	         Fire at 10:15am on the 2nd-to-last last day of every month.
0 15 10 ? * 6L	         Fire at 10:15am on the last Friday of every month.
0 15 10 ? * 6L	         Fire at 10:15am on the last Friday of every month.
0 15 10 ? * 6L 2019-2020 Fire at 10:15am on every last friday of every month during the years 2019 and 2020.
0 15 10 ? * 6#3	         Fire at 10:15am on the third Friday of every month.
0 0 12 1/5 * ?	         Fire at 12pm (noon) every 5 days every month, starting on the first day of the month.
0 11 11 11 11 ?	         Fire every November 11th at 11:11am.
0 0 * ? * * *            Fire  the top of every hour of every day.
*/10 * * * * ?           Fire every ten seconds.
0 0 8-10 * * ? 2020      Fire at 8, 9 and 10 o'clock of every day during the year 2020.
0 0 6,19 ? * *           Fire at 6:00 AM and 7:00 PM every day.
0 0/30 8-10 ? * *        Fire at 8:00, 8:30, 9:00, 9:30, 10:00 and 10:30 every day.
0 0 9-17 * * MON-FRI     Fire on the hour nine-to-five weekdays.
0 0 0 25 12 ?            Fire at every Christmas Day at midnight, no matter what day of the week it is.
0 15 10 ? * 6L 2022-2025 Fire at 10:15 AM on every Friday of every month during the years 2022, 2023, 2024 and 2025.
0 30 11 ? * 6#2          Fire at 11:30 AM on the second Friday of every month.

Pay attention to the effects of ‘?’ and ‘*’ in the day-of-week and day-of-month fields!

Cron launch type

It is possible to create this type of workflows from Wexflow Designer or through XML editing. However, here is a sample workflow that starts every two minutes:

<?xml version="1.0" encoding="utf-8"?>
<Workflow xmlns="urn:wexflow-schema" id="75" name="Workflow_Cron" description="Workflow_Cron">
  <Settings>
    <Setting name="launchType" value="cron" />
    <Setting name="cronExpression" value="0 0/2 * * * ?" /> <!-- Every two minutes -->
    <Setting name="enabled" value="true" />
  </Settings>
  <Tasks>
    <Task id="1" name="FilesLoader" description="Loading files" enabled="true">
      <Setting name="file" value="C:\WexflowTesting\file1.txt" />
    </Task>
    <Task id="2" name="Wait" description="Wait for 10 seconds..." enabled="true">
      <Setting name="duration" value="00.00:00:10" />
    </Task>
    <Task id="3" name="FilesCopier" description="Copying files" enabled="true">
      <Setting name="selectFiles" value="1" />
      <Setting name="destFolder" value="C:\WexflowTesting\Cron" />
      <Setting name="overwrite" value="true" />
    </Task>
  </Tasks>
</Workflow>
Clone this wiki locally