Ohjelmointi

Työn ajoitus Quartz.NET: n avulla ASP.NET Core -sovelluksessa

Kun työskentelet verkkosovellusten parissa, joudut usein suorittamaan tiettyjä tehtäviä taustalla. Joissakin tapauksissa nämä ovat tehtäviä, jotka tulisi suorittaa ennalta määrätyin aikavälein.

Quartz.NET on avoimen lähdekoodin .NET-portti suositusta Java-työn aikataulutuskehyksestä. Se on ollut käytössä pitkään ja tarjoaa erinomaisen tuen työskenneltäessä Cron-lausekkeiden kanssa. Voit oppia lisää Quartz.NET: stä täältä.

Tässä artikkelissa käsitellään keskustelua siitä, miten voimme työskennellä Quartz.NET: n kanssa ASP.NET Core -ohjelmassa taustatöiden suunnittelua varten.

Jotta voit työskennellä tässä artikkelissa annettujen koodiesimerkkien kanssa, järjestelmässäsi on oltava asennettuna Visual Studio 2019. Jos sinulla ei vielä ole kopiota, voit ladata Visual Studio 2019 täältä.

Luo ASP.NET Core API -projekti

Ensinnäkin, luodaan ASP.NET Core -projekti Visual Studiossa. Olettaen, että Visual Studio 2019 on asennettu järjestelmään, luo uusi ASP.NET Core -projekti Visual Studioon noudattamalla seuraavia ohjeita.

  1. Käynnistä Visual Studio IDE.
  2. Napsauta Luo uusi projekti.
  3. Valitse Luo uusi projekti -ikkunassa ”ASP.NET Core Web Application” näytetystä malliluettelosta.
  4. Napsauta Seuraava.
  5. Määritä seuraavan projektin nimi ja sijainti uuden Konfiguroi uusi projekti -ikkunassa.
  6. Napsauta Luo.
  7. Valitse Luo uusi ASP.NET-ydinverkkosovellus -ikkunassa .NET Core ajonaikaiseksi ja ASP.NET Core 2.2 (tai uudempi) yläreunan avattavasta luettelosta. Käytän täällä ASP.NET Core 3.0: ta.
  8. Luo uusi ASP.NET Core API -sovellus valitsemalla projektimalliksi “API”.
  9. Varmista, että valintaruudut Ota Docker-tuki käyttöön ja Määritä HTTPS: lle ei ole valittu, koska emme käytä näitä ominaisuuksia täällä.
  10. Varmista, että todennukseksi on määritetty Ei todentamista, koska emme myöskään käytä todennusta.
  11. Napsauta Luo.

Tämä luo uuden ASP.NET Core API -projektin Visual Studioon. Valitse Ohjainten ratkaisukansio Solution Explorer -ikkunassa ja napsauta “Lisää -> Ohjain…” luodaksesi uuden ohjaimen nimeltä DefaultController.

Seuraavaksi, kun haluat työskennellä Quartzin kanssa, sinun on asennettava Quartz-paketti NuGetistä. Voit tehdä tämän joko Visual Studio 2019 IDE: n sisällä olevan NuGet-paketinhallinnan kautta tai suorittamalla seuraavan komennon NuGet-paketinhallintakonsolissa:

Asenna pakettikvartsi

Quartz.NET-työt, laukaisimet ja aikataulut

Quartz.NET: n kolme pääkäsitettä ovat työpaikat, laukaisimet ja aikataulut. Työ sisältää koodin tehtävän tai suoritettavan työn suorittamiseksi. Työtä edustaa luokka, joka toteuttaa IJob-käyttöliittymän. Triggerillä määritetään työn aikataulu ja muut yksityiskohdat. Voit käyttää liipaisinta ja määrittää, miten työ suoritetaan. Ajastin on komponentti, joka vastaa töiden kyselystä ja suorittamisesta ennalta määritettyjen aikataulujen perusteella.

Luo ajoitin Quartz.NET: n avulla

On huomattava, että sovelluksessa voi olla useita ajastimia. Käytämme kuitenkin vain yhtä ajoitinta yksinkertaisuuden vuoksi. Seuraava koodinpätkä kuvaa, miten voit luoda ajoittajainstanssin.

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

Kun ajastin on luotu, voit käyttää seuraavaa koodia Startup.cs-tiedoston ConfigureServices-menetelmässä lisätäksesi ajastimen esiintymän yksittäispalveluna.

palvelut.AddSingleton (ajoitin);

Käynnistä ja pysäytä ajoitin Quartz.NET: n avulla

Käynnistämme ja pysäytämme ajastimen hyödyntämällä hosting-palvelua. Tätä varten sinun on luotava luokka, joka toteuttaa IHostingService-käyttöliittymän alla olevan koodikatkelman mukaisesti.

julkinen luokka CustomQuartzHostedService: IHostedService

{

yksityinen vain luku IScheduler _scheduler;

public CustomQuartzHostedService (IScheduler-ajastin)

        {

_scheduler = ajastin;

        }

julkinen asynkronointi Tehtävä StartAsync (CancellationToken cancellationToken)

        {

odota _scheduler? .Aloita (cancellationToken);

        }

public async Tehtävä StopAsync (CancellationToken cancellationToken)

        {

odota _scheduler? .Sammutus (cancellationToken);

        }

 }

Huomaa, että sinun tulisi rekisteröidä isännöity palvelu palvelukokoelmaan ConfigureServices-menetelmällä käyttämällä alla olevaa koodinpätkää.

palvelut.AddHostedService ();

Tässä on päivitetty ConfigureServices-menetelmä viitteellesi:

public void ConfigureServices (IServiceCollection-palvelut)

{

palvelut.AddControllers ();

var ajastin =

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

palvelut.AddSingleton (ajoitin);

palvelut.AddHostedService ();

}

Luo työ Quartz.NET: n avulla

Kuten sanoin aiemmin, työ on luokka, joka toteuttaa IJob-käyttöliittymän ja sisältää Execute () -menetelmän. Execute () -menetelmä hyväksyy tyypin IJobExecutionContext.

Seuraava koodinpätkä kuvaa työluokan, joka sisältää myös asynkronisen Execute () -menetelmän. Tämä menetelmä sisältää koodin, joka vastaa tehtävää, jonka työsi tulisi suorittaa.

[DisallowConcurrentExecution]

julkinen luokka Ilmoitustyö: IJob

    {

yksityinen vain luku ILogger _logger;

julkinen NotificationJob (ILogger-kirjaaja)

        {

_logger = kirjaaja;

        }

public Task Execute (IJobExecutionContext-konteksti)

        {

_logger.LogInformation ("Hei maailma!");

return Task.CompletedTask;

        }

    }

Luo työpaikkatehdas Quartz.NET: n avulla

Työtehdas on luokka, joka perii IJobFactory-käyttöliittymän ja toteuttaa NewJob () - ja ReturnJob () -menetelmät. Seuraavaa koodinpätkää voidaan käyttää luomaan tehdasluokka, joka voi luoda ja palauttaa työilmentymän.

julkinen luokka CustomQuartzJobFactory: IJobFactory

    {

yksityinen vain luku IServiceProvider _serviceProvider;

public CustomQuartzJobFactory (IServiceProvider serviceProvider)

        {

_serviceProvider = serviceProvider;

        }

julkinen IJob NewJob (TriggerFiredBundle triggerFiredBundle,

IScheduler-ajastin)

        {

var jobDetail = triggerFiredBundle.JobDetail;

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

        }

public void ReturnJob (IJob-työ) {}

    }

Huomaa, että tämä toteutus ei hyödynnä työn yhdistämistä. Jos haluat käyttää työnjakoa, sinun on vaihdettava NewJob () -metodi ja sitten toteutettava ReturnJob () -menetelmä.

Luo JobMetadata-luokka työn metatietojen tallentamiseksi

Käytämme mukautettua luokkaa työhön liittyvien metatietojen tallentamiseen, eli työn tunnuksen, nimen jne. Seuraava luokka edustaa työn metatietoluokkaa.

julkisen luokan JobMetadata

    {

julkinen opas JobId {get; aseta; }

public Type JobType {get; }

julkinen merkkijono JobName {get; }

julkinen merkkijono CronExpression {get; }

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

merkkijono cronExpression)

        {

JobId = Id;

JobType = jobType;

JobName = työn nimi;

CronExpression = cronExpression;

        }

    }

Luo isännöity palvelu Quartz.NET-ajastimen käynnistämiseksi ja pysäyttämiseksi

Seuraavaksi meidän on toteutettava isännöity palvelu. Isännöity palvelu on luokka, joka toteuttaa IHostedService-käyttöliittymän ja käynnistää kvartsi-ajastimen. Seuraava koodiluettelo kuvaa mukautettua isännöityä palveluluokkaa.

julkinen luokka CustomQuartzHostedService: IHostedService

    {

yksityinen vain luku ISchedulerFactory schedulerFactory;

yksityinen vain IJobFactory jobFactory;

yksityinen vain luku JobMetadata jobMetadata;

julkinen CustomQuartzHostedService (ISchedulerFactory

schedulerFactory,

JobMetadata jobMetadata,

IJobFactory työpaikkaFactory)

        {

this.schedulerFactory = SchedulerFactory;

this.jobMetadata = työMetadata;

this.jobFactory = jobFactory;

        }

julkinen IScheduler Scheduler {get; aseta; }

julkinen asynkronointi Tehtävä StartAsync (CancellationToken cancellationToken)

        {

Scheduler = odota schedulerFactory.GetScheduler ();

Scheduler.JobFactory = jobFactory;

var job = CreateJob (jobMetadata);

var trigger = CreateTrigger (jobMetadata);

odota Scheduler.ScheduleJob (työ, laukaisin, peruutusToken);

odota Scheduler.Start (cancellationToken);

        }

public async Tehtävä StopAsync (CancellationToken cancellationToken)

        {

odota Ajastinta? .Sammutus (cancellationToken);

        }

yksityinen ITrigger CreateTrigger (JobMetadata jobMetadata)

        {

palauta TriggerBuilder.Create ()

.WithIdentity (jobMetadata.JobId.ToString ())

.WithCronSchedule (jobMetadata.CronExpression)

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

.Rakentaa();

        }

yksityinen IJobDetail CreateJob (JobMetadata jobMetadata)

        {

palauta JobBuilder

.Luo (jobMetadata.JobType)

.WithIdentity (jobMetadata.JobId.ToString ())

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

.Rakentaa();

        }

    }

Seuraava koodinpätkä näyttää Startup-luokan ConfigureServices-menetelmän koko koodin.

public void ConfigureServices (IServiceCollection-palvelut)

{

palvelut.AddControllers ();

palvelut. AddSingleton ();

palvelut. AddSingleton ();

palvelut. AddSingleton ();

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

palvelut.AddHostedService ();

}

Ja se on kaikki mitä sinun tarvitsee tehdä! Kun suoritat sovelluksen, huomaat, että NotificationJob-luokan Execute () -menetelmä suoritetaan kerran 10 sekunnissa.

Quartz.NET on hyvä valinta ajastimien toteuttamiseen sovelluksissasi. Voit hyödyntää Quartz.NET: n pysyvyysominaisuutta tallentaaksesi työpaikkasi tietokantaan, kuten SQL Server, PostgreSQL tai SQLite.

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