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.