septembre 18, 2021

Créer un background job avec Quartz.Net en .NET Core

Il y a des processus que vous voulez lancer fréquemment et de façon automatique en tache de fond de votre application. Il existe plein de librairies capables d’effectuer ce travail comme Hangfire mais aujourd’hui, j’ai décidé de vous parler de Quartz.Net dans ce post.

Nous allons donc, dans ce post, créer une application Console qui génèrera un nombre aléatoire toutes les 15 secondes.

Après avoir créé une application Console en .NET, la première étape sera de récupérer le package Nuget dans votre projet.

Créer la classe du job

Ensuite créons une classe qui va générer un nombre aléatoire avec 4 digit et l(afficher dans la console. La classe doit implémenter l’interface IJob qui provent du namesapce Quartz.

using Quartz;
using System;
using System.Threading.Tasks;

namespace QuartzSample
{
    public class NumberGeneratorJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            Console.WriteLine($"Your # is:                        {RandomNumber(1000,9999)}");
            await Task.CompletedTask;
        }

        private int RandomNumber(int min, int max)
        {
            var random = new Random();
            return random.Next(min, max);
        }
    }
}

Paramétrage de Quart.Net et planification du job

Après avoir créé la classe du job, nous allons maintenant terminer cet exemple. Dans mon exemple j’ai pris une Console App .NET 6.0 donc nous n’avons pas de méthode main et avons une classe « ‘minimaliste ».

Nous avons besoin de 5 étapes pour celà :

  1. Créer une scheduler Factory
  2. Récupérer et planifier le scheduler
  3. Créer le job
  4. Créer le trigger
  5. Planifier le job
using Quartz;
using Quartz.Impl;
using QuartzSample;
// 1. Create a scheduler Factory
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();            
// 2. Get and start a scheduler
IScheduler scheduler = await schedulerFactory.GetScheduler();
await scheduler.Start();            
// 3. Create a job
IJobDetail job = JobBuilder.Create<NumberGeneratorJob>()
        .WithIdentity("number generator job", "number generator group")
        .Build();            
// 4. Create a trigger
ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("number generator trigger", "number generator group")
    .WithSimpleSchedule(x => x.WithIntervalInSeconds(15).RepeatForever())
    .Build();            
// 5. Schedule the job using the job and trigger 
await scheduler.ScheduleJob(job, trigger); Console.ReadLine();

Une fois tout celà terminé, vous obtenez un job qui se lance toutes les 15 secondes et génère un nombre aléatoire en l’affichant dans la console !

Quartz est une bonne alternative à Hangfire même si elle est moins fournie. Il lui manque une IHM comme dans Hangfire mais reste tout de même intéressant.

Cela offre des possibilités de synchro de BDD , de nettoyage de dossiers ou de fichiers etc…

L’exemple complet est disponible librement sur mon GIT ici.

Happy coding !