Programavimas

Kaip suplanuoti darbus naudojant „Quartz.NET“ ASP.NET Core

Dirbdami žiniatinklio programose dažnai turėsite atlikti tam tikras užduotis fone. Kai kuriais atvejais tai bus užduotys, kurios turėtų būti vykdomos iš anksto nustatytais laiko intervalais.

„Quartz.NET“ yra populiariosios „Java“ darbų planavimo sistemos atvirojo kodo .NET prievadas. Jis buvo naudojamas ilgą laiką ir puikiai palaiko dirbant su „Cron“ išraiškomis. Daugiau apie „Quartz.NET“ galite sužinoti iš ankstesnio įrašo čia.

Šiame straipsnyje aptariama, kaip mes galime dirbti su „Quartz.NET“ sistemoje „ASP.NET Core“ planuodami foninius darbus.

Norėdami dirbti su šiame straipsnyje pateiktais kodų pavyzdžiais, sistemoje turite būti įdiegę „Visual Studio 2019“. Jei dar neturite kopijos, galite atsisiųsti „Visual Studio 2019“ čia.

Sukurkite ASP.NET Core API projektą

Pirmiausia sukurkime ASP.NET Core projektą „Visual Studio“. Darant prielaidą, kad „Visual Studio 2019“ yra įdiegta jūsų sistemoje, atlikite toliau nurodytus veiksmus, kad sukurtumėte naują „ASP.NET Core“ projektą „Visual Studio“.

  1. Paleiskite „Visual Studio IDE“.
  2. Spustelėkite „Sukurti naują projektą“.
  3. Lange „Kurti naują projektą“ iš rodomų šablonų sąrašo pasirinkite „ASP.NET Core Web Application“.
  4. Spustelėkite Pirmyn.
  5. Tada rodomame lange „Konfigūruoti naują projektą“ nurodykite naujo projekto pavadinimą ir vietą.
  6. Spustelėkite Sukurti.
  7. Lange „Kurti naują ASP.NET pagrindinę žiniatinklio programą“ viršuje esančiame išskleidžiamajame sąraše pasirinkite .NET Core kaip vykdymo laiką ir ASP.NET Core 2.2 (ar naujesnę). Čia naudosiu ASP.NET Core 3.0.
  8. Pasirinkite „API“ kaip projekto šabloną, kad sukurtumėte naują ASP.NET Core API programą.
  9. Įsitikinkite, kad nepažymėti žymės langeliai „Įgalinti„ Docker “palaikymą“ ir „Konfigūruoti HTTPS“, nes čia nenaudosime tų funkcijų.
  10. Įsitikinkite, kad autentifikavimas nustatytas kaip „Be autentifikavimo“, nes mes taip pat nenaudosime autentifikavimo.
  11. Spustelėkite Sukurti.

Tai sukurs naują ASP.NET Core API projektą „Visual Studio“. Lange Solution Explorer pasirinkite „Controllers solution“ aplanką ir spustelėkite „Add -> Controller…“, kad sukurtumėte naują valdiklį pavadinimu „DefaultController“.

Tada, norėdami dirbti su „Quartz“, turėtumėte įdiegti „Quartz“ paketą iš „NuGet“. Tai galite padaryti naudodami „NuGet“ paketų tvarkytuvę „Visual Studio 2019 IDE“ arba vykdydami šią komandą „NuGet“ paketų tvarkyklės konsolėje:

„Install-Package Quartz“

„Quartz.NET“ užduotys, aktyvikliai ir planavimo priemonės

Trys pagrindinės „Quartz.NET“ sąvokos yra užduotys, aktyvikliai ir tvarkaraščiai. Užduotyje yra kodas, skirtas atlikti užduotį arba užduotį, kurią reikia atlikti. Darbą atstovauja klasė, įgyvendinanti „IJob“ sąsają. Trigeris naudojamas nurodyti grafiką ir kitą išsamią darbo informaciją. Norėdami pasinaudoti trigeriu, galite nurodyti, kaip darbas turėtų būti vykdomas. Tvarkaraštis yra komponentas, kuris yra atsakingas už apklausą ir darbų vykdymą pagal iš anksto nustatytus tvarkaraščius.

Sukurkite planavimo priemonę naudodami „Quartz.NET“

Reikėtų pažymėti, kad programoje galite turėti kelis tvarkaraščius. Tačiau paprastumo sumetimais čia naudosime tik vieną tvarkaraštį. Šis kodo fragmentas parodo, kaip galite sukurti planavimo priemonės egzempliorių.

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

Sukūrus tvarkaraštį, galite naudoti šį kodą „ConfigureServices“ metodo faile „Startup.cs“, kad pridėtumėte tvarkaraščio egzempliorių kaip vienkartinę paslaugą.

paslaugos.AddSingleton (planuoklis);

Paleiskite ir sustabdykite tvarkaraštį naudodami „Quartz.NET“

Norėdami paleisti ir sustabdyti tvarkaraštį, pasinaudosime prieglobos paslauga. Norėdami tai padaryti, turite sukurti klasę, įgyvendinančią „IHostingService“ sąsają, kaip parodyta toliau pateiktame kodo fragmente.

viešoji klasė „CustomQuartzHostedService“: „IHostedService“

{

privatus, tik skaitomas IScheduler _scheduler;

public CustomQuartzHostedService („IScheduler“ tvarkaraštis)

        {

_scheduler = tvarkaraštis;

        }

viešoji asinchroninė užduotis „StartAsync“ („CancellationToken cancellationToken“)

        {

laukti _scheduler? .Pradėti (cancellationToken);

        }

viešoji asinchroninė užduotis StopAsync (CancellationToken cancellationToken)

        {

laukti _scheduler? .Išjungti (cancellationToken);

        }

 }

Atminkite, kad turėtumėte užregistruoti priglobtą paslaugą paslaugų kolekcijoje „ConfigureServices“ metodu, naudodami toliau pateiktą kodo fragmentą.

paslaugos.AddHostedService ();

Čia pateikiamas atnaujintas „ConfigureServices“ metodas:

public void „ConfigureServices“ („IServiceCollection“ paslaugos)

{

paslaugos.AddControllers ();

var tvarkaraštis =

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

paslaugos.AddSingleton (planuoklis);

paslaugos.AddHostedService ();

}

Sukurkite darbą naudodami „Quartz.NET“

Kaip jau sakiau anksčiau, darbas yra klasė, įgyvendinanti „IJob“ sąsają ir turinti „Execute“) metodą. Metodas Execute () priima IJobExecutionContext tipo egzempliorių.

Šis kodo fragmentas iliustruoja darbo klasę, kurioje taip pat yra asinchroninis „Execute“ () metodas. Šiame metode yra kodas, atitinkantis užduotį, kurią turėtų atlikti jūsų darbas.

[DisallowConcurrentExecution]

visuomenės klasė NotificationJob: IJob

    {

privatus tik skaitomas ILogger _logger;

viešas „NotificationJob“ („ILogger logger“)

        {

_logger = logger;

        }

public Task Execute („IJobExecutionContext“ kontekstas)

        {

_logger.LogInformation („Labas pasaulis!“);

return Task.CompletedTask;

        }

    }

Sukurkite darbo fabriką naudodami „Quartz.NET“

Darbų gamykla yra klasė, kuri paveldi „IJobFactory“ sąsają ir įgyvendina „NewJob“ () ir „ReturnJob“ () metodus. Šis kodo fragmentas gali būti naudojamas kuriant gamyklos klasę, kuri gali sukurti ir grąžinti darbo egzempliorių.

viešoji klasė „CustomQuartzJobFactory“: „IJobFactory“

    {

privatus, tik skaitomas IServiceProvider _serviceProvider;

public CustomQuartzJobFactory („IServiceProvider serviceProvider“)

        {

_serviceProvider = serviceProvider;

        }

public IJob NewJob („TriggerFiredBundle triggerFiredBundle“,

„IScheduler“ tvarkaraštis)

        {

var jobDetail = triggerFiredBundle.JobDetail;

grįžti (IJob) _serviceProvider.GetService (jobDetail.JobType);

        }

public void „ReturnJob“ („IJob“ darbas) {}

    }

Atminkite, kad šis diegimas neišnaudoja darbo telkimo pranašumų. Jei norite naudoti darbo vietų kaupimą, turėtumėte pakeisti „NewJob“ () metodą ir įdiegti „ReturnJob“ () metodą.

Sukurkite „JobMetadata“ klasę, kad išsaugotumėte savo darbo metaduomenis

Mes naudosime pasirinktinę klasę, kad išsaugotume su darbu susijusius metaduomenis, t. Y. Darbo ID, vardą ir kt. Ši klasė atspindi darbo metaduomenų klasę.

visuomenės klasė „JobMetadata“

    {

public Guid JobId {get; rinkinys; }

public Type JobType {get; }

vieša eilutė JobName {get; }

viešoji eilutė „CronExpression“ {get; }

public JobMetadata („Guid ID“, „typeType“ tipo, eilutės „jobName“,

eilutės „cronExpression“)

        {

JobId = Id;

JobType = jobType;

JobName = jobName;

CronExpression = cronExpression;

        }

    }

Norėdami paleisti ir sustabdyti „Quartz.NET“ planavimo priemonę, sukurkite priglobtą paslaugą

Tada turėsime įdiegti priglobtą paslaugą. Patalpinta paslauga yra klasė, įgyvendinanti „IHostedService“ sąsają ir paleidžianti kvarco tvarkaraštį. Šis kodų sąrašas iliustruoja pasirinktinę priglobtų paslaugų klasę.

viešoji klasė „CustomQuartzHostedService“: „IHostedService“

    {

privatus, tik skaitomas ISchedulerFactory schedulerFactory;

privatus, tik skaitomas „IJobFactory jobFactory“;

privatus, tik skaitomas JobMetadata jobMetadata;

viešoji „CustomQuartzHostedService“ („ISchedulerFactory“

schedulerFactory,

JobMetadata jobMetadata,

„IJobFactory jobFactory“)

        {

this.schedulerFactory = schedulerFactory;

this.jobMetadata = jobMetadata;

this.jobFactory = jobFactory;

        }

public IScheduler Scheduler {get; rinkinys; }

viešoji asinchroninė užduotis „StartAsync“ („CancellationToken cancellationToken“)

        {

Scheduler = laukti schedulerFactory.GetScheduler ();

Scheduler.JobFactory = jobFactory;

var job = CreateJob (jobMetadata);

var trigger = CreateTrigger (jobMetadata);

laukti Scheduler.ScheduleJob (darbas, aktyviklis, cancellationToken);

laukti Scheduler.Start (cancellationToken);

        }

viešoji asinchroninė užduotis StopAsync (CancellationToken cancellationToken)

        {

laukti Tvarkaraščio? .Išjungti (cancellationToken);

        }

privatus „ITrigger“ „CreateTrigger“ („JobMetadata jobMetadata“)

        {

grąžinti „TriggerBuilder.Create“ (

.WithIdentity (jobMetadata.JobId.ToString ())

.WithCronSchedule (jobMetadata.CronExpression)

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

.Pastatykite ();

        }

privatus „IJobDetail“ „CreateJob“ („JobMetadata jobMetadata“)

        {

grąžinti „JobBuilder“

.Create (jobMetadata.JobType)

.WithIdentity (jobMetadata.JobId.ToString ())

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

.Pastatykite ();

        }

    }

Šis kodo fragmentas rodo visą „Startup“ klasės „ConfigureServices“ metodo kodą.

public void „ConfigureServices“ („IServiceCollection“ paslaugos)

{

paslaugos.AddControllers ();

paslaugos.AddSingleton ();

paslaugos.AddSingleton ();

paslaugos.AddSingleton ();

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

paslaugos.AddHostedService ();

}

Ir tai viskas, ką turite padaryti! Vykdydami programą pastebėsite, kad „NotificationJob“ klasės „Execute“) metodas vykdomas kartą per 10 sekundžių.

„Quartz.NET“ yra geras pasirinkimas planuokliams diegti jūsų programose. Galite pasinaudoti „Quartz.NET“ atkaklumo funkcija ir išsaugoti savo užduotis tokioje duomenų bazėje kaip „SQL Server“, „PostgreSQL“ ar „SQLite“.

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