Programmering

Sådan planlægger du job med Quartz.NET i ASP.NET Core

Når du arbejder på webapplikationer, skal du ofte udføre bestemte opgaver i baggrunden. I nogle tilfælde vil dette være opgaver, der skal udføres med foruddefinerede tidsintervaller.

Quartz.NET er en open source .NET-port i den populære Java-jobplanlægningsramme. Det har været i brug i lang tid og giver fremragende support til at arbejde med Cron-udtryk. Du kan lære mere om Quartz.NET fra et tidligere indlæg her.

Denne artikel præsenterer en diskussion af, hvordan vi kan arbejde med Quartz.NET i ASP.NET Core for at planlægge baggrundsjob.

For at arbejde med kodeeksemplerne i denne artikel skal du have Visual Studio 2019 installeret i dit system. Hvis du ikke allerede har en kopi, kan du downloade Visual Studio 2019 her.

Opret et ASP.NET Core API-projekt

Lad os først starte med at oprette et ASP.NET Core-projekt i Visual Studio. Forudsat at Visual Studio 2019 er installeret i dit system, skal du følge trinene beskrevet nedenfor for at oprette et nyt ASP.NET Core-projekt i Visual Studio.

  1. Start Visual Studio IDE.
  2. Klik på "Opret nyt projekt."
  3. I vinduet "Opret nyt projekt" skal du vælge "ASP.NET Core Web Application" fra listen over skabeloner, der vises.
  4. Klik på Næste.
  5. I vinduet "Konfigurer dit nye projekt", der vises nedenfor, skal du angive navnet og placeringen for det nye projekt.
  6. Klik på Opret.
  7. I vinduet "Opret ny ASP.NET Core-webapplikation" skal du vælge .NET Core som runtime og ASP.NET Core 2.2 (eller nyere) fra rullelisten øverst. Jeg bruger ASP.NET Core 3.0 her.
  8. Vælg “API” som projektskabelon for at oprette en ny ASP.NET Core API-applikation.
  9. Sørg for, at afkrydsningsfelterne "Aktivér Docker-support" og "Konfigurer til HTTPS" ikke er markeret, da vi ikke bruger disse funktioner her.
  10. Sørg for, at godkendelse er indstillet som "Ingen godkendelse", da vi heller ikke bruger godkendelse.
  11. Klik på Opret.

Dette opretter et nyt ASP.NET Core API-projekt i Visual Studio. Vælg Controllers-løsningsmappen i vinduet Solution Explorer, og klik på "Tilføj -> Controller ..." for at oprette en ny controller med navnet DefaultController.

Dernæst skal du installere Quartz-pakken fra NuGet for at arbejde med Quartz. Du kan gøre dette enten via NuGet pakkehåndtering inde i Visual Studio 2019 IDE eller ved at udføre følgende kommando på NuGet pakkehåndteringskonsol:

Installationspakke kvarts

Quartz.NET job, udløsere og planlæggere

De tre hovedkoncepter i Quartz.NET er job, udløsere og planlæggere. Et job indeholder koden til at udføre en opgave eller et job, der skal udføres. Et job repræsenteres af en klasse, der implementerer IJob-grænsefladen. En trigger bruges til at specificere tidsplanen og andre detaljer for et job. Du kan drage fordel af en trigger for at specificere, hvordan jobbet skal udføres. Planlæggeren er den komponent, der er ansvarlig for afstemning og udførelse af job baseret på foruddefinerede tidsplaner.

Opret en planlægning ved hjælp af Quartz.NET

Det skal bemærkes, at du kan have flere planlæggere i en applikation. Vi bruger dog kun en planlægning her for enkelhedens skyld. Følgende kodestykke illustrerer, hvordan du kan oprette en planlægningsinstans.

var scheduler = StdSchedulerFactory.GetDefaultScheduler (). GetAwaiter (). GetResult ();

Når planlæggeren er oprettet, kan du bruge følgende kode i ConfigureServices-metoden i Startup.cs-filen til at tilføje planlægningsinstansen som en singleton-tjeneste.

services.AddSingleton (planlægger);

Start og stop en planlægning ved hjælp af Quartz.NET

For at starte og stoppe planlæggeren drager vi fordel af en hostingtjeneste. For at gøre dette skal du oprette en klasse, der implementerer IHostingService-grænsefladen som vist i kodeuddraget nedenfor.

offentlig klasse CustomQuartzHostedService: IHostedService

{

privat readonly IScheduler _scheduler;

offentlig CustomQuartzHostedService (IScheduler planlægger)

        {

_scheduler = planlægger;

        }

offentlig async Opgave StartAsync (CancellationToken cancellationToken)

        {

afventer _scheduler? .Start (cancellationToken);

        }

offentlig asynk Task StopAsync (CancellationToken cancellationToken)

        {

afventer _scheduler? .Shutdown (cancellationToken);

        }

 }

Bemærk, at du skal registrere den hostede tjeneste i servicesamlingen i ConfigureServices-metoden ved hjælp af kodestykket nedenfor.

services.AddHostedService ();

Her er den opdaterede ConfigureServices-metode til din reference:

offentlig ugyldighed ConfigureServices (IServiceCollection-tjenester)

{

services.AddControllers ();

var scheduler =

StdSchedulerFactory.GetDefaultScheduler (). GetAwaiter (). GetResult ();

services.AddSingleton (planlægger);

services.AddHostedService ();

}

Opret et job ved hjælp af Quartz.NET

Som jeg sagde tidligere, er et job en klasse, der implementerer IJob-interface og indeholder Execute () -metoden. Metoden Execute () accepterer en forekomst af typen IJobExecutionContext.

Følgende kodestykke illustrerer en jobklasse, der også indeholder en asynkron metode (). Denne metode indeholder den kode, der svarer til den opgave, dit job skal udføre.

[DisallowConcurrentExecution]

offentlig klasse NotificationJob: IJob

    {

privat readonly ILogger _logger;

public NotificationJob (ILogger logger)

        {

_logger = logger;

        }

public Task Execute (IJobExecutionContext context)

        {

_logger.LogInformation ("Hej verden!");

returnere Task.CompletedTask;

        }

    }

Opret en jobfabrik ved hjælp af Quartz.NET

En jobfabrik er en klasse, der arver IJobFactory-grænsefladen og implementerer metoderne NewJob () og ReturnJob (). Følgende kodestykke kan bruges til at oprette en fabriksklasse, der kan oprette og returnere en jobforekomst.

offentlig klasse CustomQuartzJobFactory: IJobFactory

    {

privat readonly IServiceProvider _serviceProvider;

offentlig CustomQuartzJobFactory (IServiceProvider serviceProvider)

        {

_serviceProvider = serviceProvider;

        }

offentlig IJob NewJob (TriggerFiredBundle triggerFiredBundle,

ISplanlægningsplanlægger)

        {

var jobDetail = triggerFiredBundle.JobDetail;

returnere (IJob) _serviceProvider.GetService (jobDetail.JobType);

        }

offentligt ugyldigt ReturnJob (IJob-job) {}

    }

Bemærk, at denne implementering ikke drager fordel af jobpooling. Hvis du vil bruge jobpooling, skal du ændre metoden NewJob () og derefter implementere metoden ReturnJob ().

Opret en JobMetadata-klasse for at gemme dine jobmetadata

Vi bruger en brugerdefineret klasse til at gemme de metadata, der er relateret til et job, dvs. job-id, navn osv. Den følgende klasse repræsenterer jobmetadata-klassen.

offentlig klasse JobMetadata

    {

public Guid JobId {get; sæt; }

offentlig Type JobType {get; }

offentlig streng Jobnavn {get; }

offentlig streng CronExpression {get; }

public JobMetadata (Guid Id, Type jobType, string jobName,

streng cronExpression)

        {

JobId = Id;

JobType = jobType;

Jobnavn = jobnavn;

CronExpression = cronExpression;

        }

    }

Opret en hostet tjeneste for at starte og stoppe Quartz.NET-planlæggeren

Derefter skal vi implementere en hostet tjeneste. En hostet service er en klasse, der implementerer IHostedService-grænsefladen og starter Quartz-planlæggeren. Følgende kodeliste illustrerer en tilpasset hostet serviceklasse.

offentlig klasse CustomQuartzHostedService: IHostedService

    {

privat readonly ISchedulerFactory schedulerFactory;

privat readonly IJobFactory jobFactory;

privat readonly JobMetadata jobMetadata;

offentlig CustomQuartzHostedService (ISchedulerFactory

planlæggerfabrik,

JobMetadata jobMetadata,

IJobFactory jobFactory)

        {

this.schedulerFactory = schedulerFactory;

this.jobMetadata = jobMetadata;

this.jobFactory = jobFactory;

        }

offentlig IScheduler Scheduler {get; sæt; }

offentlig async Opgave StartAsync (CancellationToken cancellationToken)

        {

Scheduler = afventer schedulerFactory.GetScheduler ();

Scheduler.JobFactory = jobFactory;

var job = CreateJob (jobMetadata);

var trigger = CreateTrigger (jobMetadata);

afventer Scheduler.ScheduleJob (job, trigger, cancellationToken);

afventer Scheduler.Start (cancellationToken);

        }

offentlig asynk Task StopAsync (CancellationToken cancellationToken)

        {

afventer planlægger? .Lukning (cancellationToken);

        }

privat ITrigger CreateTrigger (JobMetadata jobMetadata)

        {

returner TriggerBuilder.Create ()

.WithIdentity (jobMetadata.JobId.ToString ())

.WithCronSchedule (jobMetadata.CronExpression)

.WithDescription ($ "{jobMetadata.JobName}")

.Byg ();

        }

privat IJobDetail CreateJob (JobMetadata jobMetadata)

        {

returner JobBuilder

.Opret (jobMetadata.JobType)

.WithIdentity (jobMetadata.JobId.ToString ())

.WithDescription ($ "{jobMetadata.JobName}")

.Byg ();

        }

    }

Følgende kodestykke viser den komplette kode for ConfigureServices-metoden i Startup-klassen.

offentlig ugyldighed ConfigureServices (IServiceCollection-tjenester)

{

services.AddControllers ();

services.AddSingleton ();

services.AddSingleton ();

services.AddSingleton ();

services.AddSingleton (ny JobMetadata (Guid.NewGuid (), typeof (NotificationJob), "Notifikationsjob", "0/10 * * * *?"));

services.AddHostedService ();

}

Og det er alt hvad du skal gøre! Når du udfører applikationen, vil du bemærke, at metoden Execute () i NotificationJob-klassen kører en gang hvert 10. sekund.

Quartz.NET er et godt valg til implementering af planlæggere i dine applikationer. Du kan drage fordel af persistensfunktionen i Quartz.NET til også at gemme dine job i en database som SQL Server, PostgreSQL eller SQLite.

$config[zx-auto] not found$config[zx-overlay] not found