Contents

Overview

Scheduling is an essential feature for the Enterprise. Helidon has its own implementation of Scheduling functionality based on Cron-utils.

Maven Coordinates

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

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

Usage

For scheduling periodic tasks, it is possible to choose a fixed rate or a Cron expression.

Fixed rate

Scheduling with fixed rate using Scheduling.fixedRate() builder.
FixedRate.builder()
        .delay(10)
        .initialDelay(5)
        .timeUnit(TimeUnit.MINUTES)
        .task(inv -> System.out.println("Every 10 minutes, first invocation 5 minutes after start"))
        .build();
Copied

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

Invocation metadata
FixedRate.builder()
        .delay(10)
        .task(inv -> System.out.println("Method invoked " + inv.description()))
        .build();
Copied

Configuration options

KeyKindTypeDefault ValueDescription
delay-byVALUEDurationPT0SInitial delay of the first invocation
delay-typeVALUEi.h.s.F.DelayTypeSINCE_PREVIOUS_STARTConfigure whether the interval between the invocations should be calculated from the time when previous task started or ended
enabledVALUEBooleantrueWhether the task is enabled
idVALUEString Identification of the started task
intervalVALUEDuration Fixed interval between each invocation
Deprecated Options
KeyKindTypeDefault ValueDescription
delayVALUELong Fixed rate delay between each invocation
initial-delayVALUELong Initial delay of the first invocation
time-unitVALUETimeUnitTimeUnit.SECONDSjava.util.concurrent.TimeUnit TimeUnit used for interpretation of values provided with io.helidon.scheduling.FixedRateConfig.Builder#delay(long) and io.helidon.scheduling.FixedRateConfig.Builder#initialDelay(long)

Cron

For more complicated interval definition, Cron expression can be leveraged with Scheduling.cron() builder.

Scheduling with Cron expression
Cron.builder()
        .expression("0 15 8 ? * *")
        .task(inv -> System.out.println("Executer every day at 8:15"))
        .build();
Copied

Timezone Configuration

By default, Cron expressions are evaluated using the system’s default timezone. You can specify a custom timezone to control when the cron expression triggers, regardless of the system’s timezone.

Scheduling with custom timezone
Cron.builder()
        .expression("0 0 9 * * ?")
        .zone(ZoneId.of("America/New_York"))
        .task(inv -> System.out.println("Executes every day at 9:00 AM Eastern Time"))
        .build();
Copied

The timezone determines when the cron expression triggers. For example, a cron expression 0 0 9 * * ? (every day at 9:00 AM) with zone America/New_York will trigger at 9:00 AM Eastern Time, regardless of the server’s timezone setting.

Configuration options

KeyKindTypeDefault ValueDescription
concurrentVALUEBooleantrueAllow concurrent execution if previous task didn't finish before next execution
enabledVALUEBooleantrueWhether the task is enabled
expressionVALUEString Cron expression for specifying period of execution
idVALUEString Identification of the started task
zoneVALUEZoneId Time zone to use for cron expression evaluation

Cron expression syntax

Cron expressions should be configured as follows.

Cron expression

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/5initial 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 provided as task parameter.

Configuration

Scheduling is configurable with Helidon Config.

Example of configuring
FixedRate.builder()
        .config(Config.create(() -> ConfigSources.create(
                """
                        delay: 4
                        delay-type: SINCE_PREVIOUS_END
                        initial-delay: 1
                        time-unit: SECONDS
                        """,
                MediaTypes.APPLICATION_X_YAML)))
        .task(inv -> System.out.println("Every 4 minutes, first invocation 1 minutes after start"))
        .build();
Copied

Task Management

A io.helidon.scheduling.TaskManager can be used to manage tasks that are started within Helidon. When using imperative programming model, you can either provide a custom implementation of this interface to task builder (method taskManager), or you can use the "default" one that can be obtained by invoking io.helidon.service.registry.Services.get(TaskManager.class). When using the default TaskManager from io.helidon.service.registry.Services, there is no need to explicitly register it with the task builders.

When using declarative programming model, the TaskManager can be injected. It is a Singleton service that will be used by all scheduled tasks in the current application.

Examples

Fixed Rate Example

For simple fixed rate invocation use .

Example of scheduling with fixed rate using FixedRate.builder() builder.
FixedRate.builder()
        .delay(10)
        .initialDelay(5)
        .timeUnit(TimeUnit.MINUTES)
        .task(inv -> System.out.println("Every 10 minutes, first invocation 5 minutes after start"))
        .build();
Copied

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

Example with invocation metadata
FixedRate.builder()
        .delay(10)
        .task(inv -> System.out.println("Method invoked " + inv.description()))
        .build();
Copied

Reference