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();
}
}
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 deBackgroundJob.Enqueue
. El métodoEnqueue
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étodoEnqueue
:“`c#
[HttpPost]
[Route(“TareaDeTrabajoDeSegundoPlano”)]
public IActionResult TareaDeTrabajoDeSegundoPlano()
{
var jobId = BackgroundJobClient.Current.Enqueue(() => EjecutarProcesoDeImportacion());
correo.EnviarCorreoElectronicoDeSoporte(“Trabajo de segundo plano completo”, “Prueba”, false, true);
}
En este ejemplo, el método
ThrowIfCancellationRequested
verifica si el trabajo ha sido cancelado y lanza una excepciónJobAbortedException
si lo ha sido. El métodoRequeue
se usa para actualizar el estado del trabajo e informar el progreso. También puede usar el eventoJobProgressChanged
para recibir actualizaciones de progreso en tiempo real.