Scheduling periodic Tasks in Quarkus

Quarkus does not provide support for EJB therefore you cannot rely on EJB Timers to schedule simple tasks. However, thanks to the extension quarkus-scheduler it is very simple to add this functionality.

Let’s create a simple project with Quarkus Maven plugin:

mvn io.quarkus:quarkus-maven-plugin:0.19.1:create \
    -DprojectGroupId=com.sample \
    -DprojectArtifactId=demo-scheduler \
    -DclassName="com.sample.CountEndpoint" \
    -Dpath="/count" \
    -Dextensions="scheduler"

By the way, when the Quarkus CLI is available, you can use a simpler script to bootstrap your projects:

$ quarkus create-project --groupid=com.sample --artifactId=demo-scheduler --version=1.0  demo-scheduler --extension=scheduler

And here is a minimalist example of a Task which uses the @io.quarkus.scheduler.Scheduled annotation to run a task every 10 seconds:

package com.sample;

import java.util.concurrent.atomic.AtomicInteger;
import javax.enterprise.context.ApplicationScoped;
import io.quarkus.scheduler.Scheduled;

@ApplicationScoped              
public class Counter {

    private AtomicInteger counter = new AtomicInteger();

    public int get() {
        return counter.get();
    }

    @Scheduled(every="10s")     
    void increment() {
        counter.incrementAndGet();
    }

}

You can monitor the status of your Counter through a simple REST Endpoint:

package com.sample;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/count")
public class CountEndpoint {

    @Inject
    Counter myCounter;            


    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String count() {
        return "count: " + myCounter.get();  
    }
}

Using Cron based scheduler

Another alternative format for the @Scheduled annotation is to include a cron expression within it:

Here is an example, which schedules a Task every day at 8 AM:

@Scheduled(cron="0 0 8 * * ?")
void morningTask() {}
Found the article helpful? if so please follow us on Socials