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.microprofile.scheduling</groupId>
<artifactId>helidon-microprofile-scheduling</artifactId>
</dependency>Usage
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.
@FixedRate(initialDelay = 5, value = 10, timeUnit = TimeUnit.MINUTES)All values defined with the annotation can be overridden from the config.
fully.qualified.ClassName.methodName:
schedule:
initial-delay: 5
delay: 15
time-unit: HOURSMetadata like human-readable interval description or configured values are available through FixedRateInvocation injected as method parameter.
@FixedRate(initialDelay = 5, value = 10, timeUnit = TimeUnit.MINUTES)Cron expression
For more complicated interval definition, cron expression can be leveraged with @Schedule annotation.
@Scheduled("0 15 8 ? * *", concurrentExecution = false)
public void methodName() { ... }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 | inital 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 injected as method parameter.
@Scheduled("0 15 8 ? * *")
public void methodName(CronInvocation inv) { ... }Configuration
Scheduled annotation properties can be overridden using application.yaml properties
fully.qualified.ClassName.methodName:
schedule:
cron: "* * * * * ?"
concurrent: false| Property | Description |
|---|---|
| cron | String containing cron setup |
| concurrent | Boolean, equivalent concurrentExecution property of @Scheduled. Default true. |
Examples
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");
}FixedRate Metadata Injection
@FixedRate(initialDelay = 5, value = 10, timeUnit = TimeUnit.MINUTES)
public void methodName(FixedRateInvocation inv) {
System.out.println("Method invoked " + inv.description());
}Cron expression
@Scheduled("0 15 8 ? * *", concurrentExecution = false)
public void methodName() {
System.out.println("Executer every day at 8:15");
}Scheduled Metadata Injection.
@Scheduled("0 15 8 ? * *")
public void methodName(CronInvocation inv) {
System.out.println("Method invoked " + inv.description());
}