es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  ,

Answer

  1. Avatar for 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:

    1. Instale el paquete Quartz.AspNetCore.
    2. Cree una clase MyJob que implemente la interfaz IJob.

    3. Durante la configuración de la DI en el método ConfigureServices, agregue el programador Quartz utilizando el método de extensión AddQuartz. Dentro del lambda de configuración, utilice el método ScheduleJob para programar la clase MyJob basada en la expresión cron especificada en el método WithCronSchedule:

    services.AddQuartz(quartzConfiguration =>
    {
        quartzConfiguration.ScheduleJob<myjob>(jobConfiguration =>
        {
            jobConfiguration.WithCronSchedule("0 */5 * * * ?"); //cada 5 minutos
        });
    })
    
    1. Utilice el método de extensión AddQuartzHostedService para agregar el servicio alojado Quartz y especifique la propiedad WaitForJobsToComplete como verdadera:
    services.AddQuartzHostedService(quartzConfiguration =>
    {
        quartzConfiguration.WaitForJobsToComplete = true;
    });
    
    1. Agregue el servicio de trabajo como un servicio alojado:
    services.AddHostedService<worker>();
    

    El código completo se vería así:

    public static void Main(string[] args)
    {
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddQuartz(quartzConfiguration =>
                {
                    quartzConfiguration.ScheduleJob<myjob>(jobConfiguration =>
                    {
                        jobConfiguration.WithCronSchedule("0 */5 * * * ?"); //cada 5 minutos
                    });
                })
                .AddQuartzHostedService(quartzConfiguration =>
                {
                    quartzConfiguration.WaitForJobsToComplete = true;
                })
                .AddHostedService<worker>();
            })
            .Build()
            .Run();
    }
    

    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 * * * ?".

Comments are closed.