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.

Eliminando trabajos no exitosos en Hangfire al inicio

Mientras se usa Hangfire, cuando se detiene el worker en el que se usa Hangfire, los trabajos quedan atascados con el estado “Processing” o “Scheduled”. Y en el siguiente inicio, los trabajos se ejecutan automáticamente. Estoy teniendo problemas para eliminar los trabajos antiguos de la instancia previa de mi worker.
Intenté ejecutar esto cuando se está iniciando el worker, pero los trabajos se ejecutan antes que esto.

¿Hay alguna forma de resolver esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Al utilizar Hangfire, si el trabajador se detiene, los trabajos pueden quedarse atascados con el estado “Procesando” o “Programado”. En el próximo inicio, los trabajos se ejecutarán automáticamente, pero puede haber problemas para eliminar los trabajos antiguos de la instancia anterior del trabajador. El código proporcionado en la pregunta intenta eliminar los trabajos antiguos utilizando la API de Hangfire, pero los trabajos se ejecutan antes de que este código pueda ejecutarse.

    Una solución a este problema es utilizar el panel de control de Hangfire para eliminar manualmente los trabajos antiguos. Otra solución es verificar el estado de cada trabajo antes de intentar eliminarlo. Si el trabajo está en estado “Procesando”, espere a que se complete antes de eliminarlo. Si el trabajo está en estado “Programado”, cancélelo antes de eliminarlo. Aquí tienes un ejemplo de cómo hacerlo:

    var trabajosAEliminar = await _hangfireJobRepository.RetrieveAllNotSucceededJobs();
    
    foreach (var trabajo in trabajosAEliminar)
    {
        var estado = BackgroundJob.GetState(trabajo.Id.ToString()); 
        if (estado.Name == "Procesando")
        {
            while (estado.Name == "Procesando")
            {
                await Task.Delay(1000); //esperar 1 segundo
                estado = BackgroundJob.GetState(trabajo.Id.ToString()); //actualizar estado
            }
        }
        else if (estado.Name == "Programado")
        {
            BackgroundJob.Delete(trabajo.Id.ToString(), "cancel"); //cancelar el trabajo
        }
    
        //eliminar el trabajo
        BackgroundJob.Delete(trabajo.Id.ToString());
    }
    

    Este código verifica el estado de cada trabajo y espera a que los trabajos en proceso se completen o cancela los trabajos programados antes de eliminarlos. Esto debería evitar que se ejecuten los trabajos antes de que sean eliminados.

Comments are closed.