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>Usage
For scheduling periodic tasks, it is possible to choose a fixed rate or a Cron expression.
Fixed rate
Scheduling.fixedRate() builder.Scheduling.fixedRate()
.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.
Scheduling.fixedRate()
.delay(10)
.task(inv -> System.out.println("Method invoked " + inv.description()))
.build();Type: io.helidon.scheduling.FixedRate
Configuration options
| key | type | default value | description |
|---|---|---|---|
delay | long | Fixed rate delay between each invocation. Time unit is by default java.util.concurrent.TimeUnit#SECONDS, can be specified with io.helidon.scheduling.Scheduling.FixedRateBuilder#timeUnit(java.util.concurrent.TimeUnit). @return delay between each invocation |
| key | type | default value | description |
|---|---|---|---|
delay-type | DelayType (SINCE_PREVIOUS_START, SINCE_PREVIOUS_END) | @io.helidon.scheduling.FixedRate.DelayType@.SINCE_PREVIOUS_START | Configure whether the delay between the invocations should be calculated from the time when previous task started or ended. Delay type is by default FixedRate.DelayType#SINCE_PREVIOUS_START. @return delay type |
initial-delay | long | 0 | Initial delay of the first invocation. Time unit is by default java.util.concurrent.TimeUnit#SECONDS, can be specified with io.helidon.scheduling.Scheduling.FixedRateBuilder#timeUnit(java.util.concurrent.TimeUnit) timeUnit(). @return initial delay value |
time-unit | TimeUnit (NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS) | TimeUnit.SECONDS | java.util.concurrent.TimeUnit TimeUnit used for interpretation of values provided with io.helidon.scheduling.Scheduling.FixedRateBuilder#delay(long) and io.helidon.scheduling.Scheduling.FixedRateBuilder#initialDelay(long). @return time unit for interpreting values
in io.helidon.scheduling.Scheduling.FixedRateBuilder#delay(long)
and io.helidon.scheduling.Scheduling.FixedRateBuilder#initialDelay(long) |
Cron
For more complicated interval definition, Cron expression can be leveraged with Scheduling.cron() builder.
Scheduling.cron()
.expression("0 15 8 ? * *")
.task(inv -> System.out.println("Executer every day at 8:15"))
.build();Type: io.helidon.scheduling.Cron
Configuration options
| key | type | default value | description |
|---|---|---|---|
expression | string | Cron expression for specifying period of execution. <b>Examples:</b>
@return cron expression |
| key | type | default value | description |
|---|---|---|---|
concurrent | boolean | true | Allow concurrent execution if previous task didn’t finish before next execution. Default value is @return true for allow concurrent execution. |
Cron expression syntax
Cron expressions should be configured as follows.
Cron expression
<seconds> <minutes> <hours> <day-of-month> <month> <day-of-week> <year>| Order | Name | Supported values | Supported field format | Optional |
|---|---|---|---|---|
| 1 | seconds | 0-59 | CONST, LIST, RANGE, WILDCARD, INCREMENT | false |
| 2 | minutes | 0-59 | CONST, LIST, RANGE, WILDCARD, INCREMENT | false |
| 3 | hours | 0-23 | CONST, LIST, RANGE, WILDCARD, INCREMENT | false |
| 4 | day-of-month | 1-31 | CONST, LIST, RANGE, WILDCARD, INCREMENT, ANY, LAST, WEEKDAY | false |
| 5 | month | 1-12 or JAN-DEC | CONST, LIST, RANGE, WILDCARD, INCREMENT | false |
| 6 | day-of-week | 1-7 or SUN-SAT | CONST, LIST, RANGE, WILDCARD, INCREMENT, ANY, NTH, LAST | false |
| 7 | year | 1970-2099 | CONST, LIST, RANGE, WILDCARD, INCREMENT | true |
| Name | Regex format | Example | Description |
|---|---|---|---|
| CONST | \d+ | 12 | exact value |
| LIST | \d+,\d+(,\d+)* | 1,2,3,4 | list of constants |
| RANGE | \d+-\d+ | 15-30 | range of values from-to |
| WILDCARD | \* | * | all values withing the field |
| INCREMENT | \d+\/\d+ | 0/5 | initial 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#3 | nth day of the month, 2#3 means third monday of the month |
| LAST | \d*L(+\d+|\-\d+)? | 3L-3 | last day of the month in day-of-month or last nth day in the day-of-week |
| WEEKDAY | \# | 1#3 | nearest weekday of the nth day of month, 1W is the first monday of the week |
| Cron expression | Description |
|---|---|
| * * * * * ? | Every second |
| 0/2 * * * * ? * | Every 2 seconds |
| 0 45 9 ? * * | Every day at 9:45 |
| 0 15 8 ? * MON-FRI | Every 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.
Scheduling.fixedRate()
.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();Examples
Fixed rate
For simple fixed rate invocation use .
Scheduling.fixedRate() builder.Scheduling.fixedRate()
.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.
Scheduling.fixedRate()
.delay(10)
.task(inv -> System.out.println("Method invoked " + inv.description()))
.build();