Carrito de compras

Quartz - Tareas automáticas simples en .NET Core

04 jun. Personas frente a una computadora

Quartz es un antiguo elemento básico de muchos desarrolladores de ASP.Net, utilizado como una forma de ejecutar tareas en segundo plano en un temporizador, de forma confiable y agrupada. Quartz.NET es compatible con Stantard 2.0, por lo que puede utilizarlo fácilmente en sus aplicaciones.

Quartz.NET tiene 3 conceptos principales:

  • El Job: Son tareas en segundo plano que se pueden ejecutar.
  • El Trigger: Controla cuándo se ejecuta un Job y se activa en algún tipo de programa
  • El Scheduler: Coordina los Jobs y Triggers, ejecutando los Jobs según lo requieran los Triggers.

Quartz.NET proporciona una solución mucho más robusta. Puede asegurarse de que las tareas solo se ejecuten en momentos específicos del día (por ejemplo, 2:30 a.m.), solo en días específicos, o cualquier combinación de estos mediante el uso de un Trigger Cron.

Permite ejecutar múltiples instancias de su aplicación de forma agrupada, de modo que solo una instancia pueda ejecutar una tarea determinada a la vez. Se ejecutará en segundo plano de su aplicación, verificando los triggers que están activados y ejecutando los jobs asociados según sea necesario. Debe configurar el programador inicialmente, pero no necesita preocuparse por iniciarlo o detenerlo porque IHostedService realiza la administración.

Quartz.NET es un paquete .NET Standard 2.0 NuGet, por lo que es muy fácil de instalar en su aplicación. Para más información sobre cómo crear un Job básico en .NET Core, puede ingresar al siguiente enlace: https://andrewlock.net/using-quartz-net-with-asp-net-core-and-worker-services/

A continuación, se realizará una prueba, para la cual se creó un proyecto de servicio para los jobs. Puede instalar el paquete de alojamiento Quartz.NET utilizando dotnet add package Quartz.Extensions.Hosting.

El .csproj para el proyecto, debería verse así:

Esto agrega el paquete de servicio alojado, que incluye el paquete principal Quartz.NET dentro. A continuación, debemos registrar los servicios Quartz y Quartz IHostedService en nuestra aplicación.

Agregar el servicio alojado Quartz.NET

Debe realizar dos pasos para registrar el servicio alojado de Quartz.NET:

  • Registrar los servicios requeridos de Quartz.NET con el contenedor DI
  • Registrar el servicio alojado

En las aplicaciones ASP.NET Core, normalmente haría ambas cosas en el método Startup.ConfigureServices (). Sin embargo, los servicios de Jobs no usan clases de inicio, por lo que se registra en el método ConfigureServices en IHostBuilder en Program.cs:

Crear un IJob
Para este ejemplo implementaremos un "hola mundo" que se escribe en un ILogger <T>, por lo tanto en la consola. Debe implementar la interfaz Quartz.NET IJob que contiene un único método Execute () asíncrono.

Considere que estamos usando la inyección de dependencia aquí, para inyectar el registrador en el constructor.

El [DisallowConcurrentExecution] evita que Quartz.NET intente ejecutar el mismo trabajo al mismo tiempo. Después de creado el Job, debemos registrarlo con el contenedor DI junto con un disparador.

Configurar el Job en Quartz.NET Cron
Las expresiones cron permiten una programación compleja del temporizador para que pueda establecer reglas como "disparar cada media hora entre las 8:00 am y las 10:00 am, los días 5 y 20 de cada mes". Solo asegúrese de consultar la documentación para ver ejemplos, ya que no todas las expresiones Cron utilizadas por diferentes sistemas son intercambiables.

El siguiente ejemplo muestra cómo registrar HelloWorldJob con un disparador que se ejecuta cada 5 segundos:

En resumen:
Cree una JobKey única para el trabajo. Se utiliza para vincular el trabajo y su activador. Hay otros enfoques para vincular trabajos y desencadenar, pero esto es tan bueno como cualquier otro.

Registre HelloWorldJob con AddJob <T>. Esto hace dos cosas: agrega HelloWorldJob al contenedor DI para que se pueda crear y registra el trabajo con Quartz internamente.

Agregue un disparador para ejecutar el trabajo cada 5 segundos. Utilizando JobKey para asociar el disparador con un trabajo y se le otorga al disparador  un nombre único (no es necesario para este ejemplo, pero es importante si ejecuta Quartz en modo agrupado, por lo que es una buena práctica). Finalmente, establezca un programa Cron para que el disparador del trabajo se ejecute cada 5 segundos.

¡Y eso es! Ya no es necesario crear una IJobFactory personalizada ni preocuparse por admitir servicios específicos. El paquete predeterminado maneja todo eso por usted; puede usar servicios de ámbito en su IJob y se eliminarán cuando finalice el trabajo.

Si ejecuta su aplicación ahora, verá los mismos mensajes de inicio que antes, y luego, cada 5 segundos, verá HelloWorldJob escribiendo en la consola:

Eso es todo lo que se necesita para empezar a trabajar, pero hay demasiadas plantillas en el método ConfigureServices para agregar un trabajo. También es poco probable que desee codificar la programación del trabajo en su aplicación. Si extrae eso a la configuración, puede usar diferentes horarios en cada entorno, por ejemplo:

Extrayendo la configuración a appsettings.json. En el nivel más básico, se busca extraer la programación Cron a la configuración. Por ejemplo, puede agregar lo siguiente a appsettings.json:

A continuación, puede anular fácilmente el programa de activación para HelloWorldJob en diferentes entornos.

Para facilitar el registro, podríamos crear un método de extensión para encapsular el registro de un IJob con Quartz y configurar su programa de activación. Este código es prácticamente el mismo que el del ejemplo anterior, pero utiliza el nombre del trabajo como clave en IConfiguration para cargar el programa Cron.

Ahora podemos limpiar Program.cs de nuestra aplicación para usar el método de extensión:

Esto es esencialmente idéntico a nuestra configuración, pero hemos facilitado agregar nuevos trabajos y mover los detalles del programa a la configuración. ¡Mucho mejor!

Tenga en cuenta que aunque ASP.NET Core permite la recarga "sobre la marcha" de appsettings.json, esto no cambiará la programación de un trabajo a menos que reinicie la aplicación. Quartz.NET carga toda su configuración al iniciar la aplicación, por lo que no detectará el cambio.

Ejecutar la aplicación nuevamente da el mismo resultado: el trabajo escribe en el resultado cada 5 segundos.

Daniel Ramos Mora | Development Engineer Consultant | Ingeniero en Sistemas de Computación

¿Te gustó? Entonces comparte la publicación: