Programiranje

Kako razporediti delovna mesta z uporabo Quartz.NET v ASP.NET Core

Pri delu s spletnimi aplikacijami boste pogosto morali izvajati določene naloge v ozadju. V nekaterih primerih bodo to naloge, ki jih je treba izvajati v vnaprej določenih časovnih intervalih.

Quartz.NET je odprtokodna vrata .NET priljubljenega okvira za razporejanje opravil Java. Uporablja se že dolgo in nudi odlično podporo za delo z izrazi Cron. Več o Quartz.NET lahko izveste iz prejšnje objave tukaj.

Ta članek predstavlja razpravo o tem, kako lahko s programom Quartz.NET v ASP.NET Core načrtujemo opravila v ozadju.

Če želite delati s primeri kod v tem članku, morate imeti v sistemu nameščen Visual Studio 2019. Če kopije še nimate, lahko Visual Studio 2019 prenesete tukaj.

Ustvarite projekt ASP.NET Core API

Najprej ustvarimo projekt ASP.NET Core v Visual Studio. Ob predpostavki, da je Visual Studio 2019 nameščen v vašem sistemu, sledite spodnjim korakom, da ustvarite nov projekt ASP.NET Core v Visual Studio.

  1. Zaženite Visual Studio IDE.
  2. Kliknite »Ustvari nov projekt«.
  3. V oknu »Ustvari nov projekt« na prikazanih seznamih predlog izberite »Spletna aplikacija ASP.NET Core«.
  4. Kliknite Naprej.
  5. V naslednjem oknu »Konfiguriranje novega projekta« določite ime in mesto novega projekta.
  6. Kliknite Ustvari.
  7. V oknu »Ustvari novo spletno aplikacijo ASP.NET Core« izberite .NET Core kot izvajalno okolje in ASP.NET Core 2.2 (ali novejšo) s spustnega seznama na vrhu. Tukaj bom uporabljal ASP.NET Core 3.0.
  8. Kot predlogo projekta izberite »API«, da ustvarite novo aplikacijo ASP.NET Core API.
  9. Prepričajte se, da sta potrditveni polji »Omogoči podporo za Docker« in »Konfiguriranje za HTTPS« odstranjeni, saj tukaj ne bomo uporabljali teh funkcij.
  10. Prepričajte se, da je preverjanje pristnosti nastavljeno na »Brez preverjanja pristnosti«, saj tudi preverjanja pristnosti ne bomo uporabljali.
  11. Kliknite Ustvari.

To bo ustvarilo nov projekt API-ja ASP.NET Core v Visual Studio. Izberite mapo rešitve Controllers v oknu Solution Explorer in kliknite »Add -> Controller ...«, da ustvarite nov krmilnik z imenom DefaultController.

Nato za delo s Quartzom namestite paket Quartz podjetja NuGet. To lahko storite prek upravitelja paketov NuGet znotraj IDE Visual Studio 2019 ali pa tako, da na konzoli upravitelja paketov NuGet izvedete naslednji ukaz:

Namestite paket Quartz

Quartz.NET opravila, sprožilci in načrtovalci

Trije glavni koncepti v Quartz.NET so opravila, sprožilci in načrtovalci. Opravilo vsebuje kodo za izvedbo naloge ali opravilo, ki ga je treba izvesti. Opravilo predstavlja razred, ki izvaja vmesnik IJob. Sprožilec se uporablja za določanje urnika in drugih podrobnosti opravila. Sprožilec lahko izkoristite, da določite, kako naj se opravilo izvede. Načrtovalnik je komponenta, ki je odgovorna za anketiranje in izvajanje opravil na podlagi vnaprej določenih urnikov.

Ustvarite načrtovalnik s pomočjo Quartz.NET

Upoštevati je treba, da lahko v aplikaciji imate več načrtovalcev. Vendar bomo tukaj zaradi enostavnosti uporabili le en razporednik. Naslednji delček kode prikazuje, kako lahko ustvarite primerek razporejevalnika.

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

Ko je razporejevalnik ustvarjen, lahko uporabite naslednjo kodo v metodi ConfigureServices datoteke Startup.cs, da dodate primerek razporejevalnika kot enostopenjsko storitev.

services.AddSingleton (razporejevalnik);

Zaženite in ustavite načrtovalnik s pomočjo Quartz.NET

Za zagon in zaustavitev načrtovalnika bomo izkoristili storitev gostovanja. Če želite to narediti, morate ustvariti razred, ki izvaja vmesnik IHostingService, kot je prikazano v spodnjem delčku kode.

javni razred CustomQuartzHostedService: IHostedService

{

zasebno samo za branje IScheduler _scheduler;

javna CustomQuartzHostedService (razporejevalnik IScheduler)

        {

_scheduler = načrtovalec;

        }

javno asinh. opravilo StartAsync (CancellationToken cancellationToken)

        {

await _scheduler? .Start (cancellationToken);

        }

javno asinh. opravilo StopAsync (CancellationToken cancellationToken)

        {

await _scheduler? .Shutdown (cancellationToken);

        }

 }

Upoštevajte, da morate gostovano storitev registrirati v zbirki storitev v metodi ConfigureServices z uporabo spodnjega delčka kode.

services.AddHostedService ();

Tu je posodobljena metoda ConfigureServices za vašo referenco:

public void ConfigureServices (storitve IServiceCollection)

{

services.AddControllers ();

razporednik var =

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

services.AddSingleton (razporejevalnik);

services.AddHostedService ();

}

Ustvarite opravilo s pomočjo Quartz.NET

Kot sem že rekel, je opravilo razred, ki izvaja vmesnik IJob in vsebuje metodo Execute (). Metoda Execute () sprejme primerek tipa IJobExecutionContext.

Naslednji delček kode prikazuje razred opravila, ki vsebuje tudi asinhrono metodo Execute (). Ta metoda vsebuje kodo, ki ustreza nalogi, ki jo mora opraviti vaše delo.

[DisallowConcurrentExecution]

javni razred NotificationJob: IJob

    {

zasebno samo za branje ILogger _logger;

javni NotificationJob (zapisovalnik ILogger)

        {

_logger = logger;

        }

javno izvajanje naloge (kontekst IJobExecutionContext)

        {

_logger.LogInformation ("Pozdravljeni, svet!");

vrni Task.CompletedTask;

        }

    }

Ustvarite tovarno delovnih mest s pomočjo Quartz.NET

Tovarna opravil je razred, ki podeduje vmesnik IJobFactory in izvaja metode NewJob () in ReturnJob (). Naslednji delček kode lahko uporabite za izdelavo tovarniškega razreda, ki lahko ustvari in vrne primerek opravila.

javni razred CustomQuartzJobFactory: IJobFactory

    {

zasebno samo za branje IServiceProvider _serviceProvider;

javni CustomQuartzJobFactory (storitev IServiceProviderProvider)

        {

_serviceProvider = serviceProvider;

        }

javni IJob NewJob (TriggerFiredBundle triggerFiredBundle,

Razporejevalnik IScheduler)

        {

var jobDetail = triggerFiredBundle.JobDetail;

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

        }

public void ReturnJob (delo IJob) {}

    }

Upoštevajte, da ta izvedba ne izkorišča združevanja delovnih mest. Če želite uporabiti združevanje opravil, spremenite metodo NewJob () in nato implementirajte metodo ReturnJob ().

Ustvarite razred JobMetadata za shranjevanje metapodatkov o vašem delovnem mestu

Za shranjevanje metapodatkov, povezanih z opravilom, bomo uporabili razred po meri, tj. ID opravila, ime itd. Naslednji razred predstavlja razred metapodatkov o opravilu.

javni razred JobMetadata

    {

javni Guid JobId {get; set; }

javni tip JobType {get; }

javni niz JobName {get; }

javni niz CronExpression {get; }

javni JobMetadata (ID vodiča, tip jobType, niz jobName,

niz cronExpression)

        {

JobId = Id;

JobType = jobType;

JobName = jobName;

CronExpression = cronExpression;

        }

    }

Ustvarite gostovano storitev za zagon in zaustavitev razporejevalnika Quartz.NET

Nato bomo morali implementirati gostovano storitev. Goščena storitev je razred, ki implementira vmesnik IHostedService in zažene razporejevalnik Quartz. Naslednji seznam kod ponazarja gostiteljski razred po meri.

javni razred CustomQuartzHostedService: IHostedService

    {

zasebno samo za branje razporejevalnik ISchedulerFactory;

zasebno samo za branje IJobFactory jobFactory;

zasebno samo za branje JobMetadata jobMetadata;

javna CustomQuartzHostedService (ISchedulerFactory

razporejevalnik tovarne,

JobMetadata jobMetadata,

IJobFactory jobFactory)

        {

this.schedulerFactory = razporejevalnikFactory;

this.jobMetadata = jobMetadata;

this.jobFactory = jobFactory;

        }

javni načrtovalec IScheduler {get; set; }

javno asinh. opravilo StartAsync (CancellationToken cancellationToken)

        {

Načrtovalec = počakajte na razporejevalnikFactory.GetScheduler ();

Scheduler.JobFactory = jobFactory;

var job = CreateJob (jobMetadata);

var sprožilec = CreateTrigger (jobMetadata);

počakajte na Scheduler.ScheduleJob (job, trigger, cancellationToken);

počakajte na Scheduler.Start (cancellationToken);

        }

javno asinh. opravilo StopAsync (CancellationToken cancellationToken)

        {

čakate na razporejevalnik? .Shutdown (cancellationToken);

        }

zasebni ITrigger CreateTrigger (JobMetadata jobMetadata)

        {

vrni TriggerBuilder.Create ()

.WithIdentity (jobMetadata.JobId.ToString ())

.WithCronSchedule (jobMetadata.CronExpression)

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

.Build ();

        }

private IJobDetail CreateJob (JobMetadata jobMetadata)

        {

vrni JobBuilder

.Ustvari (jobMetadata.JobType)

.WithIdentity (jobMetadata.JobId.ToString ())

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

.Build ();

        }

    }

Naslednji delček kode prikazuje celotno kodo metode ConfigureServices razreda Startup.

public void ConfigureServices (storitve IServiceCollection)

{

services.AddControllers ();

services.AddSingleton ();

services.AddSingleton ();

services.AddSingleton ();

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

services.AddHostedService ();

}

In to je vse, kar morate storiti! Ko zaženete aplikacijo, boste opazili, da se metoda Execute () razreda NotificationJob izvaja enkrat na 10 sekund.

Quartz.NET je dobra izbira za izvajanje načrtovalcev v vaših aplikacijah. Funkcijo trajnosti v Quartz.NET lahko izkoristite za shranjevanje svojih opravil v zbirko podatkov, kot so SQL Server, PostgreSQL ali SQLite.

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