Tengo una aplicación central de ASP.NET y quería usar Hangfire para algunas tareas en segundo plano. Configuré Hangfire como se describe en la documentación oficial y puedo llamar a las tareas habituales en segundo plano. Sin embargo, tengo problemas para llamar a los métodos con retraso.
public void Configure(/*other params*/ IBackgroundJobClient backgroundJobsClient) { //Other code backgroundJobsClient.Enqueue(() => Console.WriteLine("Method")); backgroundJobsClient.Schedule(() => Console.WriteLine("Delayed Method"), TimeSpan.FromSeconds(2)); }Solo tengo salida "Método" en la consola.
Después de esperar un minuto, tengo una excepción en mi consola:
Hangfire.Processing.BackgroundExecution[0] Execution DelayedJobScheduler está en el estado Failed ahora debido a una excepción, la ejecución se volverá a intentar no más de 00:00:04 Hangfire.PostgreSql.PostgreSqlDistributedLockException: no se pudo colocar un bloqueo en el recurso 'HangFire :locks:schedulepoller': Tiempo de espera de bloqueo. en Hangfire.PostgreSql.PostgreSqlDistributedLock.PostgreSqlDistributedLock_Init_Transaction (recurso de cadena, tiempo de espera de TimeSpan, conexión de IDbConnection, opciones de PostgreSqlStorageOptions) en Hangfire.PostgreSql.PostgreSqlDistributedLock..ctor (recurso de cadena, tiempo de espera de TimeSpan, conexión de IDbConnection, opciones de PostgreSqlConnectionOptions) en Hangfire.PostgreSql AcquireDistributedLock(recurso de cadena, tiempo de espera de TimeSpan) en Hangfire.Server.DelayedJobScheduler.UseConnectionDistributedLock[T](almacenamiento de JobStorage,
2 action) at Hangfire.Server.DelayedJobScheduler.EnqueueNextScheduledJobs(BackgroundProcessContext context) at Hangfire.Server.DelayedJobScheduler.Execute(BackgroundProcessContext context) at Hangfire.Server.BackgroundProcessDispatcherBuilder.ExecuteProcess(Guid executionId, Object state) at Hangfire.Processing.BackgroundExecution.Run(Action2, estado del objeto) !!! No se pudo colocar un bloqueo en el recurso 'HangFire:locks:schedulepoller': tiempo de espera de bloqueo.
Entonces, supongo que hay algún problema con la inicialización de métodos retrasados. ¿Alguien podría ayudarme con eso? Probablemente no configuré Hangfire correctamente para ASP.NET core.
Finalmente he encontrado una solución. La fecha se almacena en la base de datos de Hangfire en formato UTC. No lo sabía, y la documentación oficial no dice nada al respecto. El código correcto debería ser algo como esto:
DateTime.UtcNow.AddSeconds(2);Resolví este problema de la siguiente manera.
Hay una mesa de bloqueo en las mesas Hangfire . Eliminé todos los datos en la tabla de bloqueo, mi problema se resolvió.