Spring Boot: Cómo crear un Scheduled en Kotlin
Las tareas pueden ser programadas para establecer una acción en un periodo de tiempo o una fecha en concreto. Sirven para cobros automáticos, recordatorios a usuarios, etc.
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:
Estructura del proyecto
Abrimos nuestro proyecto con nuestro IDE de preferencia y creamos una clase kotlin y la nombramos como Tarea
.
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
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.