HelidonHelidon4.5.0

Scheduling

Helidon Scheduling Support

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).

pom.xml
<dependency>
  <groupId>io.helidon.scheduling</groupId>
  <artifactId>helidon-scheduling</artifactId>
</dependency>

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();

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();

Configuration options

KeyTypeDefaultDescription
delay-typeDelayTypeSINCE_PREVIOUS_STARTConfigure whether the interval between the invocations should be calculated from the time when previous task started or ended
delay-byDurationPT0SInitial delay of the first invocation
intervalDurationFixed interval between each invocation
idStringIdentification of the started task
enabledBooleantrueWhether the task is enabled
Deprecated Options
KeyTypeDefaultDescription
delayLongFixed rate delay between each invocation
time-unitTimeUnitTimeUnit.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)
initial-delayLongInitial delay of the first invocation

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();

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();

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

KeyTypeDefaultDescription
expressionStringCron expression for specifying period of execution
zoneZoneIdTime zone to use for cron expression evaluation
concurrentBooleantrueAllow concurrent execution if previous task didn't finish before next execution
idStringIdentification of the started task
enabledBooleantrueWhether the task is enabled

Cron expression

Cron expression format:

<seconds> <minutes> <hours> <day-of-month> <month> <day-of-week> <year>

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();

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();

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();

Reference

Copyright © 2018, 2026 Oracle and/or its affiliates.