Maven Coordinates

To enable Scheduling add the following dependency to your project’s pom.xml (see Managing Dependencies).

<dependency>
    <groupId>io.helidon.microprofile.scheduling</groupId>
    <artifactId>helidon-microprofile-scheduling</artifactId>
</dependency>
Copied

Scheduling

For scheduling tasks in Helidon you can choose from @Scheduled or @FixedRate annotations by required complexity of invocation interval. All you need is define method with one of the annotations in application scoped bean.

Fixed rate

For simple fixed rate invocation interval is @FixedRate the easiest way for scheduling task invocation.

Example of scheduling with fixed rate
@FixedRate(initialDelay = 5, value = 10, timeUnit = TimeUnit.MINUTES)
public void methodName() {
    System.out.println("Every 10 minutes, first invocation 5 minutes after start");
}
Copied

All values defined with the annotation can be overridden from the config.

Overiding annotated values from config
fully.quallified.ClassName.methodName:
  schedule:
    initial-delay: 5
    delay: 15
    time-unit: HOURS
Copied

Metadata like human-readable interval description or configured values are available through FixedRateInvocation injected as method parameter.

Example with ivocation metadata
@FixedRate(initialDelay = 5, value = 10, timeUnit = TimeUnit.MINUTES)
public void methodName(FixedRateInvocation inv) {
    System.out.println("Method invoked " + inv.description());
}
Copied

Cron expression

For more complicated interval definition, cron expression can be leveraged with @Schedule annotation.

Example of scheduling with cron expression
@Scheduled("0 15 8 ? * *", concurrentExecution = false)
public void methodName() {
    System.out.println("Executer every day at 8:15");
}
Copied
Cron expression format
<seconds> <minutes> <hours> <day-of-month> <month> <day-of-week> <year>
Copied
Cron expression fields
OrderNameSupported valuesSupported field formatOptional
1seconds0-59CONST, LIST, RANGE, WILDCARD, INCREMENTfalse
2minutes0-59CONST, LIST, RANGE, WILDCARD, INCREMENTfalse
3hours0-23CONST, LIST, RANGE, WILDCARD, INCREMENTfalse
4day-of-month1-31CONST, LIST, RANGE, WILDCARD, INCREMENT, ANY, LAST, WEEKDAYfalse
5month1-12 or JAN-DECCONST, LIST, RANGE, WILDCARD, INCREMENTfalse
6day-of-week1-7 or SUN-SATCONST, LIST, RANGE, WILDCARD, INCREMENT, ANY, NTH, LASTfalse
7year1970-2099CONST, LIST, RANGE, WILDCARD, INCREMENTtrue
Field formats
NameRegex formatExampleDescription
CONST\d+12exact value
LIST\d+,\d+(,\d+)*1,2,3,4list of constants
RANGE\d+-\d+15-30range of values from-to
WILDCARD\**all values withing the field
INCREMENT\d+\/\d+0/5inital number / increments, 2/5 means 2,7,9,11,16,…​
ANY\??any day(apply only to day-of-week and day-of-month)
NTH\#1#3nth day of the month, 2#3 means third monday of the month
LAST\d*L(+\d+|\-\d+)?3L-3last day of the month in day-of-month or last nth day in the day-of-week
WEEKDAY\#1#3nearest weekday of the nth day of month, 1W is the first monday of the week
Examples
Cron expressionDescription
* * * * * ?Every second
0/2 * * * * ? *Every 2 seconds
0 45 9 ? * *Every day at 9:45
0 15 8 ? * MON-FRIEvery workday at 8:15

Metadata like human-readable interval description or configured values are available through CronInvocation injected as method parameter.

Example with invocation metadata
@Scheduled("0 15 8 ? * *")
public void methodName(CronInvocation inv) {
    System.out.println("Method invoked " + inv.description());
}
Copied

Scheduled annotation properties can be overridden using application.yaml properties

Overriding annotated values from config
fully.quallified.ClassName.methodName:
  schedule:
    cron: "* * * * * ?"
    concurrent: false
Copied
Configuration properties
PropertyDescription
cronString containing cron setup
concurrentBoolean, equivalent concurrentExecution property of @Scheduled. Default true.