Spring Boot: Cómo crear un Scheduled en Kotlin

Creación de un proyecto Spring

Para crear un proyecto vacío nos dirigimos a la página oficial de Spring Initializr y lo configuramos de la siguiente manera:

Creación de un proyecto en Kotlin con Spring Initializr


Estructura del proyecto

Abrimos nuestro proyecto con nuestro IDE de preferencia y creamos una clase kotlin y la nombramos como Tarea.

Vista de nuestro proyecto desde Intellij IDEA

La clase la anotamos con un @Component y a la función reportCurrentTime con @Scheduled. El fixedRate es el tiempo que debe de ejecutarse repetidamente en intervalos de milisegundos.

package com.alexandermiss.demo.cron

import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Component


@Component
class Tarea {
    @Scheduled(fixedRate = 5000) // 5 segundos
    fun reportCurrentTime() {
        System.out.println("Esta tarea se ejecuta cada 5 segundos");
    }
}

Agregamos la anotación @EnableScheduled, si no, la ejecución de la tarea no funcionará.

package com.alexandermiss.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.scheduling.annotation.EnableScheduling

@SpringBootApplication
@EnableScheduling
class ScheduledApplication

fun main(args: Array<String>) {
	runApplication<ScheduledApplication>(*args)
}

Ejecuta la aplicación y verás la tarea en ejecución

Spring Boot Scheduled

Cambia el código del componente donde tenemos la tarea y reemplázalo por el siguiente código. Nos servirá para hacer un logging de tiempo cada vez que transcurren los 5 segundos.

package com.alexandermiss.demo.cron

import org.slf4j.LoggerFactory
import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Component
import java.text.SimpleDateFormat
import java.util.*


@Component
class Tarea {
    @Scheduled(fixedRate = 5000)
    fun reportCurrentTime() {
        log.info("The time is now {}", dateFormat.format(Date()))
    }

    companion object {
        private val log = LoggerFactory.getLogger(Tarea::class.java)
        private val dateFormat = SimpleDateFormat("HH:mm:ss")
    }
}

Observen que nos indica los intervalos de tiempo en hora, minuto y segundo transcurrido desde la última ejecución de la tarea.


Configuración avanzada

Si necesitamos que la tarea se ejecute en una determinada hora y/o fecha tenemos que usar la opción cron.

El cron acepta un patrón de 6 campos representados por asteriscos separados por un espacio, especificando segundos, minutos, hora, día, mes y días de semana cron= "* * * * * *".

Un ejemplo práctico y fácil

Algo más sencillo es poniendo una hora y fecha en específica. En este momento la fecha y hora es 11/05/2020 1:08:15 asi que, si queremos que la tarea se ejecute a la 1:10 configúralo así, (ten en cuenta que faltan casi dos minutos para cumplirse el cron):

@Scheduled(cron = "0 12 1 22 5 *")

  • Segundo: 0
  • Minuto: 12
  • Hora: 1 (formato 24 horas)
  • Día del mes: 22
  • Mes: 5 (mes de Mayo)
  • Día(s) de la semana: *


Una forma similar a FixedRate

El ejemplo del fixedRate para cada 5 segundos, lo semejante en el cron es: */5 * * * * *

Si el parámetro es 5 * * * * * el comportamiento cambiaría completamente, puesto que estaríamos diciéndole al cron que se ejecute al segundo 5 de cada minuto y no cada 5 segundos. Ésta tabla comparativa muestra la diferencia.

5 * * * * * */5 * * * * *
1:55:05 1:55:05
1:56:05 1:56:00
1:57:05 1:56:05
1:58:05 1:56:10

Finalmente dejo unos ejemplos:

Cron Descripción
0 0 * * * * Cada hora todos los días
0 0 8-10 * * * 8, 9 y 10 en punto todos los días
0 0 6,19 * * * 6 y 19 horas todos los días
0 0/30 8-10 * * * Los 30 minutos de 8 a 10. 8:30, 9:30, 10:30
0 0 9-17 * * MON-FRI Cada hora desde las 9 hasta las 17 horas de lunes a viernes.
9, 10, 11, 12, 13, 14, 15 respectivamente
0 0 0 25 12 ? A la medianoche del 25 de diciembre.
Feliz Navidad!

Ahora que ya sabemos como crear tareas, el implementarla quedará a vuestra imaginación :D

Happy coding!

Bendiciones!

Sígueme en mi canal de Telegram.


Referencias