Class CronTrigger

java.lang.Object
jakarta.enterprise.concurrent.CronTrigger
All Implemented Interfaces:
Trigger, ZonedTrigger

public class CronTrigger extends Object implements ZonedTrigger

Cron-based Trigger implementation, which supports 5 or 6 fields delimited by a single space character, plus a ZoneId. Basic cron syntax is supported. For more advanced scenarios, you can subclass this implementation or combine multiple CronTrigger instances in a Trigger implementation of your own.

Cron Expression Fields
seconds (optional)0-59, *. When absent, 0 is assumed
minutes0-59, *
hours0-23, *
dayOfMonth0-31, *, L
month1-12, JAN-DEC, January-December, *
dayOfWeekSUN-SAT, Sunday-Saturday, 0-7, *. 0 and 7 both represent Sunday: 0 to designate the first day of the week, and 7 for consistency with DayOfWeek.

Cron Expression Syntax
, delimits lists for all fields. For example, MON,WED,FRI or MAY,SEP
- delimits ranges for all fields. For example, MON-FRI or 9-17
/ specifies a repeating increment for all fields except dayOfWeek. For example, 6/7 for the hours field equates to 6,13,20.
# specifies an ordinal day of week. For example, FRI#1,SAT#L is the first Friday and last Saturday of the month.
# cannot be used within ranges (-) and increments (/).
* indicates any value is permitted.
L indicates the last day of the month. 2L indicates the second-to-last day, and so forth.

Cron Expression Examples
0 * * * * every hour at the top of the hour
0 9-17 * * MON-FRI weekdays from 9am to 5pm, at the top of each hour
0 13/3 * MAY-SEP SAT,SUN weekends from May to September, every 3 hours, starting at 1pm
30 10 * APR,AUG TUE#2,TUE#L second and last Tuesdays of April and August at 10:30am
15 22 4 10,20,L * * 4:22:15 AM on the 10th, 20th, and last day of every month
0 8-11,13-16 2L JAN-MAR * 8AM-11AM and 1PM-4PM on the second-to-last day of January, February, and March

A constructor is provided that accepts a cron expression such as the above and a timezone id. For example,

 trigger = new CronTrigger("0 7 * SEP-MAY MON-FRI", ZoneId.of("America/New_York"));
 

Another constructor allows cron fields to be specified in a fluent manner, in any order. For example,

 trigger = new CronTrigger(ZoneId.of("America/Los_Angeles"))
           .months(Month.DECEMBER)
           .daysOfMonth(24)
           .hours(16, 18);
 

The getNextRunTime method of this trigger determines the next run time based on the cron schedule. The skipRun method always returns false unless overridden by a subclass.

Methods of this class that configure the cron expression fields are not thread safe. It is the responsibility of the caller to ensure that initialization of the CronTrigger happens before it is supplied to a ManagedScheduledExecutorService and that the CronTrigger is not subsequently modified.

You can subclass CronTrigger to provide for more complex logic, such as in the following example of combining two triggers to schedule twice-a-month payroll on the 15th and last day of month or the prior Fridays when the former fall on a weekend:

 public class PayrollTrigger extends CronTrigger {
     private final CronTrigger fridaysBeforeWeekendPayrollDay;

     PayrollTrigger() {
         // Every 15th and last day of the month that is a weekday,
         super("0 10 15,L * MON-FRI", ZoneId.of("America/Chicago"));

         // Every 13th, 14th, third-to-last, and second-to-last day of the month that is a Friday,
         fridaysBeforeWeekendPayrollDay = new CronTrigger(
                 "0 10 13,14,3L,2L * FRI", getZoneId());
     }

     public ZonedDateTime getNextRunTime(LastExecution lastExec, ZonedDateTime scheduledAt) {
         ZonedDateTime time1 = super.getNextRunTime(lastExec, scheduledAt);
         ZonedDateTime time2 = fridaysBeforeWeekendPayrollDay.getNextRunTime(lastExec, scheduledAt);
         return time1.isBefore(time2) ? time1 : time2;
     }
 }
 
Since:
3.0