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.

¿El trabajo recurrente en Hangfire no se está ejecutando para una hora específica?

Soy nuevo en hangfire y estoy intentando un trabajo recurrente básico (en una aplicación de consola) como este

GlobalConfiguration.Configuration
                .UseSqlServerStorage("Server=.\\sqlexpress;Database=HangfireTest;Integrated Security=SSPI;");

            using (var server = new BackgroundJobServer())
            {

                RecurringJob.AddOrUpdate("LiveFixtures", () => Console.WriteLine("hola"), "0-59 * * * *");
                Console.WriteLine("Servidor de Hangfire iniciado. Presiona cualquier tecla para salir...");
                Console.ReadKey();
            }

Funciona bien, sin embargo, si intento con una hora específica, ambas líneas siguientes no funcionan. La hora actual es las 11:19 AM

RecurringJob.AddOrUpdate("LiveFixtures", () => Console.WriteLine("hola"), "0-59 11 * * *");
RecurringJob.AddOrUpdate("LiveFixtures", () => Console.WriteLine("hola"), "0-59 10-23 * * *");
Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual ambas líneas especificadas no funcionan puede ser debido al hecho de que Hangfire se ejecuta por defecto en Coordinated Universal Time (UTC). Por lo tanto, al especificar una hora específica para que se ejecute el trabajo, los usuarios deben tener en cuenta la diferencia horaria entre UTC y su hora local.

    Por ejemplo, si la hora actual es las 11:19 AM UTC y el usuario se encuentra en Londres, que está en la zona horaria UTC+1, el trabajo se ejecutará a las 12:19 PM hora local, lo cual corresponde a las 11:19 AM hora UTC.

    Para ajustar la programación del trabajo a una hora local específica, los usuarios deben utilizar la función integrada de Huso Horario (TimeZone) de Hangfire. Al definir un huso horario específico para el trabajo, la aplicación convertirá entre el huso horario especificado y la hora UTC, garantizando que el trabajo programado se ejecute a la hora local deseada.

    Por ejemplo, para programar un trabajo para que se ejecute todos los días a las 11:00 AM hora de Londres, el código debería modificarse de la siguiente manera:

    “`GlobalConfiguration.Configuration
    .UseSqlServerStorage(“Server=.\sqlexpress;Database=HangfireTest;Integrated Security=SSPI;”)
    .UseTimeZone(TimeZoneInfo.FindSystemTimeZoneById(“GMT Standard Time”));

    using (var server = new BackgroundJobServer())
    {
    RecurringJob.AddOrUpdate(“LiveFixtures”, () => Console.WriteLine(“hello”), “0 11 * * *”);
    Console.WriteLine(“Hangfire Server started. Press any key to exit…”);
    Console.ReadKey();
    }“`

    En estas modificaciones, utilizamos el método UseTimeZone para especificar el huso horario utilizado en la aplicación. Utilizamos el método FindSystemTimeZoneById para encontrar el objeto TimeZoneInfo asociado con el huso horario “GMT Standard Time”. Luego modificamos la expresión de programación del trabajo para que se ejecute todos los días a las 11:00 AM utilizando la expresión “0 11 * * *”, que corresponde a “a las 11:00 AM todos los días”.

    Este cambio asegurará que el trabajo se ejecute a la hora local deseada, independientemente de la hora UTC que Hangfire utiliza por defecto.

Comments are closed.