Marcos de programación de tareas en entornos distribuidos y locales

En sistemas modernos, la ejecución programada de tareas es fundamental. Desde recordatorios diarios hasta procesos empresariales complejos como cierres mensuales o campañas promocionales, los temporizadores están presentes en casi todas las capas del software.

Características comunes de las tareas programadas

  • Ejecución en un instante específico (por ejemplo, activar una promoción a medianoche).
  • Ejecución periódica con intervalo fijo (como envío de latidos cada minuto).
  • Ejecución recurrente iniciando en una fecha/hora específica (alarma diaria desde el 1° de diciembre).

Herramienta del sistema: crontab

crontab es una utilidad nativa de sistemas Unix/Linux que permite programar scripts o comandos. Su sintaxis define cuándo se ejecutará una tarea mediante cinco campos de tiempo más el comando a ejecutar:


* * * * * comando
│ │ │ │ │
│ │ │ │ └── Día de la semana (0-7, donde 0 y 7 son domingo)
│ │ │ └──── Mes (1-12)
│ │ └────── Día del mes (1-31)
│ └──────── Hora (0-23)
└────────── Minuto (0-59)

Ejemplos:


*/5 * * * * /ruta/script.sh     # Cada 5 minutos
30 18 * * * /ruta/backup.sh      # Diariamente a las 18:30
0 7 1 * * /ruta/report.sh        # Primer día de cada mes a las 7:00

Temporizadores nativos en Java

Clase Timer (obsoleta)

La clase java.util.Timer permite programar tareas, pero todas se ejecutan en un único hilo. Si una tarea falla o tarda demasiado, bloquea las siguientes. Por esta razón, ya no se recomienda su uso en producción.

ScheduledExecutorService (recomendado)

Introducido en Java 5, este servicio usa un pool de hilos para ejecutar tareas concurrentemente. Cada tarea se maneja de forma independiente, evitando bloqueos por erores o retrasos.


ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);

executor.scheduleAtFixedRate(() -> {
    System.out.println("Tarea rápida");
}, 0, 2, TimeUnit.SECONDS);

executor.scheduleWithFixedDelay(() -> {
    try { Thread.sleep(3000); } catch (Exception e) {}
    System.out.println("Tarea lenta");
}, 0, 1, TimeUnit.SECONDS);

Frameowrks avaznados: Quartz y Spring Schedule

Quartz

Framework robusto que separa claramente tres conceptos: Scheduler (planificador), Job (tarea) y Trigger (disparador). Permite múltiples triggers por job y viceversa, con soporte completo de expresiones cron.


JobDetail job = JobBuilder.newJob(MiTarea.class)
    .withIdentity("tarea1", "grupo1").build();

Trigger trigger = TriggerBuilder.newTrigger()
    .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?"))
    .build();

scheduler.scheduleJob(job, trigger);

Spring Schedule

Integrado directamente en Spring, permite configurar tareas mediante anotaciones o XML. Es ideal para aplicaciones Spring Boot.


@Component
public class TareaProgramada {

    @Scheduled(cron = "0 0 8 * * MON-FRI")
    public void enviarReporte() {
        System.out.println("Reporte enviado a las 8 AM entre semana.");
    }

    @Scheduled(fixedRate = 30000, initialDelay = 5000)
    public void monitorearSistema() {
        System.out.println("Monitoreo cada 30 segundos, primer retraso de 5s.");
    }
}

Sistemas distribuidos

En arquitecturas de microservicios, múltiples instancias pueden ejecutar la misma tarea simultáneamente, causando duplicados. Las soluciones distribuidas coordinan la ejecución entre nodos.

SchedulerX (Alibaba Cloud)

Servicio gestionado en la nube. Requiere cliente SDK y configuración en consola web. Ideal para empresas que buscan solución lista sin infraestructura propia.

elastic-job

Basado originalmente en Quartz, ahora usa ZooKeeper para coordinación. Soporta particionamiento de tareas (sharding) y reequilibrio automático al escalar nodos.


public class MiTareaDistribuida implements SimpleJob {
    @Override
    public void execute(ShardingContext ctx) {
        System.out.println("Fragmento " + ctx.getShardingItem() + " en nodo " + ctx.getTaskId());
    }
}

xxl-job

Framework ligero con interfaz web para gestión de tareas. Usa MySQL como registro central en lugar de ZooKeeper. Fácil de integrar en Spring Boot.


@XxlJob("miTarea")
public ReturnT<string> ejecutar(String param) {
    XxlJobLogger.log("Procesando parámetro: " + param);
    return ReturnT.SUCCESS;
}
</string>

LTS (Light Task Scheduler)

Otra alternativa de Alibaba, enfocada en alta disponibilidad y escalabilidad. Soporta tareas en tiempo real, repetitivas y basadas en cron. Usa ZooKeeper para descubrimiento de nodos.

Etiquetas: java spring-boot Quartz distributed-scheduling cron

Publicado el 8-16 07:40