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.

Hangfire hace que la aplicación reinicie el trabajo cada pocos minutos.

Ok, estoy usando Hangfire para un trabajo en segundo plano, pero parece que se esta encolando cada pocos minutos en una llamada de “fire and forget”.

Además, ¿cómo informo adecuadamente sobre el progreso de la llamada? Como se puede ver, solo envío un “ok” de vuelta, lo cual probablemente no sea correcto.

Mi código para ejecutar la llamada es simplemente lo siguiente:

Aquí está mi llamada en mi controlador en mi API web. Los documentos afirman que se puede usar “fire and forget” para agregar una tarea en segundo plano, pero parece que está haciendo la tarea cada pocos minutos. https://www.hangfire.io/

Lo que quiero es que se dispare una sola vez cuando se llama a la acción de mi API web.

public class BackgroundJobsController : ControllerBase
{
IImportsInterface imports;
IEmailInterface email;
public BackgroundJobsController(IImportsInterface importsInterface, IEmailInterface emailInterface)
{
imports = importsInterface;
email = emailInterface;
}

[ApiExplorerSettings(IgnoreApi = true)]
public void RunImportProcess()
{
    /*haga lo suyo*/
    // luego programe un trabajo para ejecutar el mismo método
    imports.RunServerSide();
}
[HttpPost]
[Route("BackgroundJobTask")]
public IActionResult BackgroundJobTask()
{
    var jobId = BackgroundJob.Enqueue(() => RunImportProcess());
    email.SendSupportEmail("Tarea de trabajo en segundo plano completada", "Prueba", false,true);

    return Ok();
}

}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para evitar que Hangfire lo encole a sí mismo cada pocos minutos en una llamada “fire and forget”, puede utilizar el método Enqueue en lugar de BackgroundJob.Enqueue. El método Enqueue programa una tarea que se ejecuta solo una vez. Aquí tiene un ejemplo de cómo puede modificar su código para usar el método Enqueue:

    “`c#
    [HttpPost]
    [Route(“TareaDeTrabajoDeSegundoPlano”)]
    public IActionResult TareaDeTrabajoDeSegundoPlano()
    {
    var jobId = BackgroundJobClient.Current.Enqueue(() => EjecutarProcesoDeImportacion());
    correo.EnviarCorreoElectronicoDeSoporte(“Trabajo de segundo plano completo”, “Prueba”, false, true);

    return Ok();
    

    }


    Para informar el progreso de la llamada, puede usar el parámetro `IJobCancellationToken` en el método que se está ejecutando como trabajo en segundo plano. También puede usar el parámetro `PerformContext` para acceder al contexto del trabajo que se está ejecutando actualmente. Aquí tiene un ejemplo de cómo puede modificar su método `EjecutarProcesoDeImportacion` para informar el progreso usando el parámetro `IJobCancellationToken`: ```c# public void EjecutarProcesoDeImportacion(IJobCancellationToken cancellationToken) { for (int i = 0; i < 10; i++) { cancellationToken.ThrowIfCancellationRequested(); // Realice el trabajo var progreso = (i + 1) * 10; cancellationToken.ThrowIfCancellationRequested(); // Informe el progreso BackgroundJobClient.Current.Requeue(jobId, new EnqueuedState { Reason = $"Procesando registro {i + 1}/{10}", Progress = progreso }); } }

    En este ejemplo, el método ThrowIfCancellationRequested verifica si el trabajo ha sido cancelado y lanza una excepción JobAbortedException si lo ha sido. El método Requeue se usa para actualizar el estado del trabajo e informar el progreso. También puede usar el evento JobProgressChanged para recibir actualizaciones de progreso en tiempo real.

Comments are closed.