Programmēšana

Kā ieplānot darbus, izmantojot Quartz.NET ASP.NET Core

Strādājot ar tīmekļa lietojumprogrammām, bieži vien fonā būs jāveic daži uzdevumi. Dažos gadījumos tie būs uzdevumi, kas jāveic iepriekš noteiktos laika intervālos.

Quartz.NET ir populārā Java darba plānošanas ietvara atvērtā koda .NET ports. Tas ir izmantots ilgu laiku un sniedz lielisku atbalstu darbam ar Cron izteiksmēm. Jūs varat uzzināt vairāk par Quartz.NET no iepriekšējā ziņojuma šeit.

Šajā rakstā ir sniegta diskusija par to, kā mēs varam strādāt ar Quartz.NET programmā ASP.NET Core, lai ieplānotu fona darbus.

Lai strādātu ar šajā rakstā sniegtajiem kodu piemēriem, sistēmā jābūt instalētai Visual Studio 2019. Ja jums vēl nav kopijas, varat lejupielādēt Visual Studio 2019 šeit.

Izveidojiet ASP.NET Core API projektu

Vispirms izveidosim ASP.NET Core projektu Visual Studio. Pieņemot, ka Visual Studio 2019 ir instalēta jūsu sistēmā, veiciet tālāk norādītās darbības, lai izveidotu jaunu ASP.NET Core projektu Visual Studio.

  1. Palaidiet Visual Studio IDE.
  2. Noklikšķiniet uz “Izveidot jaunu projektu”.
  3. Logā “Izveidot jaunu projektu” parādīto veidņu sarakstā atlasiet “ASP.NET Core Web Application”.
  4. Noklikšķiniet uz Tālāk.
  5. Nākamajā logā “Konfigurēt jauno projektu” norādiet jaunā projekta nosaukumu un vietu.
  6. Noklikšķiniet uz Izveidot.
  7. Logā “Izveidot jaunu ASP.NET Core tīmekļa lietojumprogrammu” augšdaļā esošajā nolaižamajā sarakstā atlasiet .NET Core kā izpildlaiku un ASP.NET Core 2.2 (vai jaunāku). Es šeit izmantošu ASP.NET Core 3.0.
  8. Atlasiet “API” kā projekta veidni, lai izveidotu jaunu ASP.NET Core API lietojumprogrammu.
  9. Pārliecinieties, vai nav atzīmētas izvēles rūtiņas “Iespējot Docker atbalstu” un “Konfigurēt HTTPS”, jo mēs šeit neizmantosim šīs funkcijas.
  10. Pārliecinieties, ka autentifikācija ir iestatīta kā “Nav autentifikācijas”, jo mēs arī neizmantosim autentifikāciju.
  11. Noklikšķiniet uz Izveidot.

Tādējādi Visual Studio tiks izveidots jauns ASP.NET Core API projekts. Logā Solution Explorer atlasiet Controllers solution mapi un noklikšķiniet uz “Add -> Controller…”, lai izveidotu jaunu kontrolleri ar nosaukumu DefaultController.

Pēc tam, lai strādātu ar Quartz, jums jāinstalē Quartz pakete no NuGet. To var izdarīt, izmantojot NuGet pakotņu pārvaldnieku Visual Studio 2019 IDE, vai arī izpildot šādu komandu NuGet pakotņu pārvaldnieka konsolē:

Install-Package Quartz

Quartz.NET uzdevumi, aktivizētāji un plānotāji

Trīs galvenie Quartz.NET jēdzieni ir darbi, aktivizētāji un plānotāji. Darbs satur kodu, lai izpildītu uzdevumu vai veicamo darbu. Darbu pārstāv klase, kas ievieš IJob saskarni. Triger tiek izmantots, lai norādītu darba grafiku un citu informāciju. Varat izmantot sprūda priekšrocības, lai norādītu, kā darbs jāveic. Plānotājs ir komponents, kas ir atbildīgs par darbu aptauju un izpildi, pamatojoties uz iepriekš noteiktiem grafikiem.

Izveidojiet plānotāju, izmantojot Quartz.NET

Jāatzīmē, ka lietojumprogrammā var būt vairāki plānotāji. Tomēr vienkāršības labad šeit izmantosim tikai vienu plānotāju. Šis koda fragments parāda, kā varat izveidot plānotāja instanci.

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

Kad plānotājs ir izveidots, faila Startup.cs metodē ConfigureServices varat izmantot šo kodu, lai plānotāja gadījumu pievienotu kā vienpakāpes pakalpojumu.

pakalpojumi.AddSingleton (plānotājs);

Sāciet un apturiet plānotāju, izmantojot Quartz.NET

Lai palaistu un apturētu plānotāju, mēs izmantosim mitināšanas pakalpojuma priekšrocības. Lai to izdarītu, jums jāizveido klase, kas ievieš IHostingService saskarni, kā parādīts tālāk sniegtajā koda fragmentā.

publiskā klase CustomQuartzHostedService: IHostedService

{

privāts tikai lasāms IScheduler _scheduler;

publiskais CustomQuartzHostedService (IScheduler plānotājs)

        {

_scheduler = plānotājs;

        }

publiskais asinhronais uzdevums StartAsync (CancellationToken cancellationToken)

        {

gaidīt _scheduler? .Sākt (cancellationToken);

        }

publiskais asinhronais uzdevums StopAsync (CancellationToken cancellationToken)

        {

gaidīt _scheduler? .Izslēgt (cancellationToken);

        }

 }

Ņemiet vērā, ka mitinātais pakalpojums ir jāreģistrē pakalpojumu kolekcijā, izmantojot ConfigureServices metodi, izmantojot tālāk sniegto koda fragmentu.

pakalpojumi.AddHostedService ();

Šeit ir atjaunināta ConfigureServices metode jūsu atsaucei:

public void ConfigureServices (IServiceCollection pakalpojumi)

{

pakalpojumi.AddControllers ();

var plānotājs =

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

pakalpojumi.AddSingleton (plānotājs);

pakalpojumi.AddHostedService ();

}

Izveidojiet darbu, izmantojot Quartz.NET

Kā jau teicu iepriekš, darbs ir klase, kas ievieš IJob saskarni un satur Execute () metodi. Metode Execute () pieņem IJobExecutionContext tipa gadījumu.

Šis koda fragments ilustrē darba klasi, kurā ir arī asinhronā Execute () metode. Šī metode satur kodu, kas atbilst uzdevumam, kas jāveic jūsu darbam.

[DisallowConcurrentExecution]

sabiedrības klase NotificationJob: IJob

    {

privāts tikai lasāms ILogger _logger;

publisks NotificationJob (ILogger reģistrētājs)

        {

_logger = reģistrētājs;

        }

public Task Execute (konteksts IJobExecutionContext)

        {

_logger.LogInformation ("Sveika pasaule!");

return Task.CompletedTask;

        }

    }

Izveidojiet darba rūpnīcu, izmantojot Quartz.NET

Darba fabrika ir klase, kas pārmanto IJobFactory saskarni un ievieš metodes NewJob () un ReturnJob (). Šo koda fragmentu var izmantot, lai izveidotu rūpnīcas klasi, kas var izveidot un atgriezt darba instanci.

publiskā klase CustomQuartzJobFactory: IJobFactory

    {

privāts tikai lasāms IServiceProvider _serviceProvider;

publiskais CustomQuartzJobFactory (IServiceProvider serviceProvider)

        {

_serviceProvider = serviceProvider;

        }

public IJob NewJob (TriggerFiredBundle triggerFiredBundle,

IScheduler plānotājs)

        {

var jobDetail = triggerFiredBundle.JobDetail;

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

        }

public void ReturnJob (IJob darbs) {}

    }

Ņemiet vērā, ka šī ieviešana neizmanto darba apvienošanas priekšrocības. Ja vēlaties izmantot darbu apvienošanu, jums jāmaina metode NewJob () un pēc tam jāievieš ReturnJob () metode.

Lai saglabātu darba metadatus, izveidojiet JobMetadata klasi

Mēs izmantosim pielāgotu klasi, lai saglabātu ar darbu saistītos metadatus, t.i., darba ID, nosaukumu utt. Šī klase apzīmē darba metadatu klasi.

sabiedrības klase JobMetadata

    {

public Guid JobId {get; komplekts; }

public Type JobType {get; }

publiska virkne JobName {get; }

publiskā virkne CronExpression {get; }

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

virkne cronExpression)

        {

JobId = Id;

JobType = jobType;

Darba nosaukums = darba nosaukums;

CronExpression = cronExpression;

        }

    }

Izveidojiet mitinātu pakalpojumu, lai palaistu un apturētu Quartz.NET plānotāju

Pēc tam mums būs jāievieš mitināts pakalpojums. Hostētais pakalpojums ir klase, kas ievieš IHostedService saskarni un iedarbina plānotāju Quartz. Šis kodu saraksts parāda pielāgotu mitinātu pakalpojumu klasi.

publiskā klase CustomQuartzHostedService: IHostedService

    {

privāts tikai lasāms ISchedulerFactory schedulerFactory;

privāts tikai lasāms IJobFactory jobFactory;

privāts tikai lasāms JobMetadata jobMetadata;

publiskais CustomQuartzHostedService (ISchedulerFactory

schedulerFactory,

JobMetadata jobMetadata,

IJobFactory jobFactory)

        {

this.schedulerFactory = schedulerFactory;

this.jobMetadata = jobMetadata;

this.jobFactory = jobFactory;

        }

publiskais IScheduler Scheduler {get; komplekts; }

publiskais asinhronais uzdevums StartAsync (CancellationToken cancellationToken)

        {

Plānotājs = gaidiet plānotājuFactory.GetScheduler ();

Plānotājs.JobFactory = jobFactory;

var job = CreateJob (jobMetadata);

var trigeris = CreateTrigger (jobMetadata);

gaidiet Scheduler.ScheduleJob (darbs, aktivizētājs, atcelšanaToken);

gaidiet Plānotājs.Sākt (cancellationToken);

        }

publiskais asinhronais uzdevums StopAsync (CancellationToken cancellationToken)

        {

gaidīt plānotāju? .Izslēgt (cancellationToken);

        }

privāts ITrigger CreateTrigger (JobMetadata jobMetadata)

        {

atgriezt TriggerBuilder.Create ()

.WithIdentity (jobMetadata.JobId.ToString ())

.WithCronSchedule (jobMetadata.CronExpression)

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

.Būvēt();

        }

privāts IJobDetail CreateJob (JobMetadata jobMetadata)

        {

atgriezties JobBuilder

. Izveidot (jobMetadata.JobType)

.WithIdentity (jobMetadata.JobId.ToString ())

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

.Būvēt();

        }

    }

Šis koda fragments parāda pilnu Startup klases ConfigureServices metodes kodu.

public void ConfigureServices (IServiceCollection pakalpojumi)

{

pakalpojumi.AddControllers ();

pakalpojumi.AddSingleton ();

pakalpojumi.AddSingleton ();

pakalpojumi.AddSingleton ();

services.AddSingleton (jauns JobMetadata (Guid.NewGuid (), typeof (NotificationJob), "Notification Job", "0/10 * * * *?"));

pakalpojumi.AddHostedService ();

}

Un tas ir viss, kas jums jādara! Izpildot lietojumprogrammu, jūs pamanīsit, ka klases NotificationJob metode Execute () darbojas reizi 10 sekundēs.

Quartz.NET ir laba izvēle plānotāju ieviešanai jūsu lietojumprogrammās. Varat izmantot Quartz.NET noturības līdzekļa priekšrocības, lai savus darbus saglabātu arī datu bāzē, piemēram, SQL Server, PostgreSQL vai SQLite.

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