blog image

Scheduling periodic tasks in the cloud microservices and reference cloud architectures

Solutions always required regularly executed and schedulled jobs which performed various tasks. 

These tasks can be sending data in regular time, cleansing database and remove unneeded objects, resending data, correcting data, checking for states of the processes, components, data. In the Oracle Siebel CRM world these are known as batch job or repeating components, in the linux world they are known as cron jobs.

For the onpremise services often some external schedullers are used such as Oracle Scheduller, dbms_scheduller etc. The schedulled tasks are also called from operating system, in linux cron tab

In this blog we will discuss the posibilities for schedulled tasks in the JAVA Quarkus framework, which we use to develop backend microservices in the cloud.

JAVA Quarkus has 2 possibilities to programatically call schedulled tasks :

  • Quarkus Scheduler
  • Quarkus Quartz.

They have different approaches and the selection needs to be good and preciselly analysed.

Quarkus Scheduler

Quarkus Scheduler runs parallel in all nodes. Considering microservices they always are high scalable running in kubernetes cluster in the pods. It cannot retry on failed or skipped executions. You can have scalled more pods running the same microservice based on load. Using Quarkus Scheduller the task will run in every pod and instance.

More information can be found here

Quarkus Quartz

Quarkus Quartz is sophisticated open source scheduler which can run in clustered mode on one node. Quarz can retry for skipped executions. It is deploying structured DB schema which is used to monitor, orchestrate and log job executions.

It has a variety of possibilities to schedulle the task from annotation , to injecting the scheduling into bean and also crontab like syntax. It works with many DB used by microservice in the cloud.

More information here 

package ch.mobi.dki.integration.control;
import ch.mobi.dki.integration.entity.Task;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import io.quarkus.scheduler.Scheduled;
import lombok.Setter;
import org.slf4j.Logger;
import java.time.Instant;

@ApplicationScoped
public class TaskBean {
    @Setter
    @Inject
    Logger logger;
    @Transactional
    @Scheduled(every = "10s", identity = "task-job")
    void schedule() {
        Task task = new Task();
        //write your code here
        logger.info("[ID-SCAN] Cronjob executed.");
        task.persist();
    }
}

Here is an example how the programatically scheduled job can look like 

@Scheduled(cron="0 15 10 * * ?") 
    void cronJob(ScheduledExecution execution) {
        counter.incrementAndGet();
        System.out.println(execution.getScheduledFireTime());
    }
    

 The DB structure of Quartz framework created in the quarkus project

dbquartz 

New Endpoint  

@GET
    @Path("/tasks")
    @Operation(summary = "Get list of tasks executed by cronjob")
    @APIResponse(responseCode = "200", description = "Successful")
    @Produces(MediaType.APPLICATION_JSON)
    @Performance(concurrency = 3000, availability = DAYS7_HOURS24, responseTime = @Timing(percentile99 = 30, percentile95 = 20, percentile90 = 10))
    public List<Task> listAll() {
        return Task.listAll(); 

will list from DB executed tasks :

tasks 

To provision the project db scheme is to be provisioned. Provided scripts were not working for me :

https://github.com/quartz-scheduler/quartz/blob/main/quartz/src/main/resources/org/quartz/impl/jdbcjobstore/tables_sqlServer.sql

https://github.com/quarkusio/quarkus-quickstarts/blob/main/quartz-quickstart/src/main/resources/db/migration/V2.0.0__QuarkusQuartzTasks.sql

Here is the working version : V2.0.0__quartz_tables.sql

 

OCI CI/CD reference Architecture for Quarkus Microservice 

Here is Oracle Cloud Infrastructure reference architecture how to deploy CI/CD pipeline for microservice in OCI :

 deploy-pipeline-devops-arch

https://docs.oracle.com/en/learn/oci-devops-cicd-on-kubernetes/index.html#task-1-set-up-the-oci-devops-project

AWS Reference Architecture to deploy Quarkus as Lambda

fig1-quarkus-lambda-app 

https://quarkus.io/guides/aws-lambda

https://aws.amazon.com/blogs/architecture/deploy-quarkus-based-applications-using-aws-lambda-with-aws-sam/

Conclusion

Quarkus framework has more approaches to implement fast and efficient schedulled task in the microservice. Repeating task are important part of modern microservices and this blog should navigate you to choose richt approach. It also gives taste how the Devops architecture for microservice in the cloud can look like. CCW has certified cloud development consultant which can help you start your cloud journey, adopt existing workloads to cloud and re-build them with cloud approach only. 

Skôr ako začneme: nahliadnite do spracovania vašich osobných údajov

Ak navštívite stránku, ktorá zapisuje cookies, v počítači sa vám vytvorí malý textový súbor, ktorý sa uloží vo vašom prehliadači. Ak rovnakú stránku navštívite nabudúce, pripojíte sa vďaka nemu na web rýchlejšie. Náš web vám ponúkne relevantné informácie a bude sa vám pracovať jednoduchšie.

Súbory cookies používame najmä na anonymnú analýzu návštevnosti a vylepšovanie našich web stránok. Ak si nastavíte blokovanie zápisu cookies do vášho prehliadača, je možné, že web sa spomalí a niektoré jeho časti nemusia fungovať úplne korektne. Viac info k spracúvaniu cookies.