Quartz.NET para C# (.NET): Guía completa para programar tareas
Quartz.NET es una potente, flexible y ampliamente utilizada librería de código abierto para la programación de tareas en aplicaciones .NET. Permite a los desarrolladores crear, gestionar y ejecutar trabajos en segundo plano según un horario definido. Si necesitas ejecutar código en un momento específico, con una periodicidad determinada o como respuesta a un evento (como los cron jobs en Linux), Quartz.NET es la solución ideal. Esta librería es un puerto del popular framework Java Quartz Scheduler.
¿Para qué sirve? En el desarrollo moderno, surgen tareas que no deben ejecutarse de forma síncrona en respuesta a una solicitud del usuario. Por ejemplo: envío de campañas de email, limpieza de archivos temporales, sincronización de datos con APIs externas, generación de informes, actualización de caché y mucho más. Quartz.NET ofrece un mecanismo robusto y tolerante a fallos para ejecutar estas tareas. Soporta la persistencia del estado de los trabajos en una base de datos (JobStore), lo que permite que sobrevivan a reinicios de la aplicación, y también admite clustering para distribuir la carga de trabajo.
A diferencia del uso simple de System.Threading.Timer o BackgroundService, Quartz.NET proporciona una API completa para gestionar el ciclo de vida de los trabajos, disparadores complejos (diario, semanal, mediante expresiones CRON), ejecución en paralelo, escucha de eventos y mucho más. Esto lo convierte en el estándar de facto para la programación de tareas en el ecosistema .NET.
Instalación
Quartz.NET se distribuye a través de NuGet. Para instalarlo, usa uno de los siguientes comandos en la consola del administrador de paquetes:
# Instalación del paquete principal
dotnet add package Quartz
# Si necesitas soporte para configuración XML
dotnet add package Quartz.Plugins
# Para usar con Dependency Injection (recomendado para ASP.NET Core)
dotnet add package Quartz.Extensions.Hosting
Para .NET Framework clásico (por ejemplo, .NET 4.8), usa la consola de NuGet:
Install-Package Quartz
Inicio rápido: Ejemplo mínimo funcional
Vamos a crear una aplicación de consola simple que muestre "¡Hola, Quartz!" cada 5 segundos.
using System;
using System.Threading.Tasks;
using Quartz;
using Quartz.Impl;
namespace QuartzQuickStart
{
// 1. Creamos el Job (tarea)
public class HelloJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
await Console.Out.WriteLineAsync($"¡Hola, Quartz! Hora: {DateTime.Now:HH:mm:ss}");
}
}
class Program
{
static async Task Main(string[] args)
{
// 2. Creamos la fábrica del planificador
StdSchedulerFactory factory = new StdSchedulerFactory();
// 3. Obtenemos el planificador
IScheduler scheduler = await factory.GetScheduler();
// 4. Iniciamos el planificador
await scheduler.Start();
// 5. Definimos el trabajo (Job)
IJobDetail job = JobBuilder.Create()
.WithIdentity("miTrabajo", "grupo1")
.Build();
// 6. Definimos el disparador (horario)
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("miDisparador", "grupo1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(5)
.RepeatForever())
.Build();
// 7. Registramos el trabajo y el disparador en el planificador
await scheduler.ScheduleJob(job, trigger);
// 8. Esperamos para que la consola no se cierre
await Task.Delay(TimeSpan.FromSeconds(30));
// 9. Detenemos el planificador
await scheduler.Shutdown();
}
}
}
Clases, métodos e interfaces principales
También en la biblioteca
Rate Limiting en PHP: guía completa para limitar solicitudes
Colas de tareas en Java: Visión general e implementación con java.util.concurrent
Cliente Elasticsearch para Java: guía completa de conexión y trabajo
inversify para TypeScript: guía completa con ejemplos