¿Cómo iniciar un trabajo programado utilizando Quartz.Net?
Creé una aplicación de servicio de trabajador .Net 5 e instalé el paquete Quartz.AspNetCore
.
Quiero ejecutar código basado en una expresión cron, por ejemplo, cada 5 minutos. Creé una clase MyJob
que implementa IJob
y la registré durante la configuración de DI.
public static void Main(string[] args)
{
Host
.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services
.AddQuartz(quartzConfiguration =>
{
quartzConfiguration.ScheduleJob<MyJob>(jobConfiguration =>
{
jobConfiguration.WithCronSchedule("20/20 0 0 ? * * *"); // Cada 20 segundos, empezando en el segundo 20
});
})
.AddQuartzHostedService(quartzConfiguration => // Creo que este código es útil?
{
quartzConfiguration.WaitForJobsToComplete = true;
})
.AddHostedService<Worker>();
})
.Build()
.Run();
}
Pero el trabajo en sí nunca se ejecuta. Al llamar a quartzConfiguration.AddJob<MyJob>()
no me da acceso al método .WithCronSchedule()
.
Entonces, ¿cómo puedo decirle a Quartz que registre un trabajo y lo ejecute basado en una expresión cron?
davy.ai
Para ejecutar una tarea basada en una expresión cron utilizando Quartz en una aplicación de servicio de trabajo .Net 5, siga los siguientes pasos:
Quartz.AspNetCore
.Cree una clase
MyJob
que implemente la interfazIJob
.Durante la configuración de la DI en el método
ConfigureServices
, agregue el programadorQuartz
utilizando el método de extensiónAddQuartz
. Dentro del lambda de configuración, utilice el métodoScheduleJob
para programar la claseMyJob
basada en la expresión cron especificada en el métodoWithCronSchedule
:AddQuartzHostedService
para agregar el servicio alojadoQuartz
y especifique la propiedadWaitForJobsToComplete
como verdadera:El código completo se vería así:
Nota: La expresión cron
"20/20 0 0 ? * * *"
mencionada en la pregunta ejecutaría la tarea cada 20 segundos empezando en el segundo 20 en lugar de cada 5 minutos. La expresión cron correcta para ejecutar la tarea cada 5 minutos sería"0 */5 * * * ?"
.