Programovanie

Ako plánovať úlohy pomocou Quartz.NET v ASP.NET Core

Pri práci s webovými aplikáciami budete často musieť niektoré úlohy vykonávať na pozadí. V niektorých prípadoch to budú úlohy, ktoré by sa mali vykonať v preddefinovaných intervaloch.

Quartz.NET je otvorený. NET port populárneho rámca plánovania úloh Java. Používa sa už dlho a poskytuje vynikajúcu podporu pre prácu s výrazmi Cron. Viac informácií o sieti Quartz.NET sa môžete dozvedieť v predchádzajúcom príspevku tu.

Tento článok predstavuje diskusiu o tom, ako môžeme pracovať s programom Quartz.NET v ASP.NET Core na plánovaní úloh na pozadí.

Ak chcete pracovať s príkladmi kódu uvedenými v tomto článku, mali by ste mať vo svojom systéme nainštalovanú aplikáciu Visual Studio 2019. Ak ešte nemáte kópiu, môžete si tu stiahnuť Visual Studio 2019.

Vytvorte projekt rozhrania ASP.NET Core API

Najprv si vytvoríme projekt ASP.NET Core v Visual Studio. Za predpokladu, že je vo vašom systéme nainštalované Visual Studio 2019, postupujte podľa krokov uvedených nižšie a vytvorte nový projekt ASP.NET Core v Visual Studio.

  1. Spustite Visual Studio IDE.
  2. Kliknite na „Vytvoriť nový projekt“.
  3. V okne „Vytvoriť nový projekt“ vyberte zo zobrazeného zoznamu šablón „Webová aplikácia ASP.NET Core“.
  4. Kliknite na Ďalej.
  5. V nasledujúcom okne „Konfigurácia nového projektu“ zadajte názov a umiestnenie nového projektu.
  6. Kliknite na tlačidlo Vytvoriť.
  7. V okne „Vytvoriť novú webovú aplikáciu ASP.NET Core“ vyberte z rozbaľovacieho zoznamu v hornej časti .NET Core ako runtime a ASP.NET Core 2.2 (alebo novší). Budem tu používať ASP.NET Core 3.0.
  8. Vyberte „API“ ako šablónu projektu a vytvorte novú aplikáciu API ASP.NET Core.
  9. Skontrolujte, či nie sú začiarknuté políčka „Povoliť podporu Docker“ a „Konfigurovať pre HTTPS“, pretože tu nebudeme tieto funkcie používať.
  10. Skontrolujte, či je overenie nastavené na „Bez overenia“, pretože tiež nebudeme používať overenie.
  11. Kliknite na tlačidlo Vytvoriť.

Týmto sa vytvorí nový projekt rozhrania ASP.NET Core API v Visual Studio. Vyberte priečinok Riešenie ovládačov v okne Prieskumníka riešení a kliknutím na „Pridať -> Ovládač ...“ vytvorte nový ovládač s názvom DefaultController.

Ďalej, aby ste mohli pracovať s Quartzom, mali by ste si nainštalovať balíček Quartz z NuGet. Môžete to urobiť buď prostredníctvom správcu balíkov NuGet vo vnútri IDE Visual Studio 2019, alebo vykonaním nasledujúceho príkazu v konzole správcu balíkov NuGet:

Inštalačný balík Quartz

Quartz.NET úlohy, spúšťače a plánovače

Tri hlavné pojmy v Quartz.NET sú úlohy, spúšťače a plánovače. Úloha obsahuje kód na vykonanie úlohy alebo úlohy, ktorá sa má vykonať. Úlohu predstavuje trieda, ktorá implementuje rozhranie IJob. Na určenie rozvrhu a ďalších podrobností úlohy sa používa spúšťač. Môžete použiť spúšťač a určiť, ako sa má úloha vykonať. Plánovač je komponent, ktorý je zodpovedný za dopytovanie a vykonávanie úloh na základe preddefinovaných plánov.

Vytvorte plánovač pomocou Quartz.NET

Je potrebné poznamenať, že v aplikácii môžete mať viac plánovačov. Kvôli jednoduchosti tu však použijeme iba jeden plánovač. Nasledujúci úryvok kódu ilustruje, ako môžete vytvoriť inštanciu plánovača.

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

Po vytvorení plánovača môžete v metóde ConfigureServices súboru Startup.cs použiť nasledujúci kód na pridanie inštancie plánovača ako singletonovej služby.

services.AddSingleton (plánovač);

Spustite a zastavte plánovač pomocou Quartz.NET

Na spustenie a zastavenie plánovača využijeme výhodu hostiteľskej služby. Ak to chcete urobiť, musíte vytvoriť triedu, ktorá implementuje rozhranie IHostingService, ako je uvedené v útržku kódu uvedenom nižšie.

verejná trieda CustomQuartzHostedService: IHostedService

{

súkromné ​​iba na čítanie IScheduler _scheduler;

public CustomQuartzHostedService (plánovač IScheduler)

        {

_scheduler = plánovač;

        }

verejná asynchronná úloha StartAsync (CancellationToken CancelToken)

        {

await _scheduler? .Start (CancelToken);

        }

verejná asynchronná úloha StopAsync (CancellationToken CancelToken)

        {

await _scheduler? .Shutdown (CancelToken);

        }

 }

Upozorňujeme, že hostenú službu by ste mali zaregistrovať v kolekcii služieb v metóde ConfigureServices pomocou útržku kódu uvedeného nižšie.

services.AddHostedService ();

Tu je aktualizovaná metóda ConfigureServices pre vašu referenciu:

public void ConfigureServices (služby IServiceCollection)

{

services.AddControllers ();

var plánovač =

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

services.AddSingleton (plánovač);

services.AddHostedService ();

}

Vytvorte prácu pomocou Quartz.NET

Ako som už uviedol skôr, úlohou je trieda, ktorá implementuje rozhranie IJob a obsahuje metódu Execute (). Metóda Execute () prijíma inštanciu typu IJobExecutionContext.

Nasledujúci úryvok kódu ilustruje triedu úloh, ktorá obsahuje aj asynchrónnu metódu Execute (). Táto metóda obsahuje kód, ktorý zodpovedá úlohe, ktorú by mala vykonávať vaša úloha.

[DisallowConcurrentExecution]

public class NotificationJob: IJob

    {

súkromné ​​iba na čítanie ILogger _logger;

public NotificationJob (ILogger logger)

        {

_logger = logger;

        }

verejné vykonávanie úloh (kontext IJobExecutionContext)

        {

_logger.LogInformation ("Hello world!");

vrátiť Task.CompletedTask;

        }

    }

Vytvorte továreň na prácu pomocou Quartz.NET

Továreň na vytváranie úloh je trieda, ktorá dedí rozhranie IJobFactory a implementuje metódy NewJob () a ReturnJob (). Nasledujúci fragment kódu možno použiť na vytvorenie továrenskej triedy, ktorá dokáže vytvoriť a vrátiť inštanciu úlohy.

verejná trieda CustomQuartzJobFactory: IJobFactory

    {

súkromné ​​iba na čítanie IServiceProvider _serviceProvider;

public CustomQuartzJobFactory (IServiceProvider serviceProvider)

        {

_serviceProvider = serviceProvider;

        }

verejný IJob NewJob (TriggerFiredBundle triggerFiredBundle,

Plánovač IScheduler)

        {

var jobDetail = triggerFiredBundle.JobDetail;

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

        }

public void ReturnJob (práca IJob) {}

    }

Upozorňujeme, že táto implementácia nevyužíva výhody združovania úloh. Ak chcete použiť združovanie úloh, mali by ste zmeniť metódu NewJob () a potom implementovať metódu ReturnJob ().

Vytvorte triedu JobMetadata, aby ste uložili svoje metadáta úloh

Na uloženie metadát týkajúcich sa úlohy, tj. ID úlohy, názvu atď., Použijeme vlastnú triedu. Nasledujúca trieda predstavuje triedu metadát úlohy.

verejná trieda JobMetadata

    {

public Guid JobId {get; sada; }

public Type JobType {get; }

verejný reťazec JobName {get; }

verejný reťazec CronExpression {get; }

verejné JobMetadata (identifikátor GUID, typ jobType, reťazec jobName,

string cronExpression)

        {

JobId = Id;

JobType = jobType;

JobName = jobName;

CronExpression = cronExpression;

        }

    }

Vytvorte hostenú službu na spustenie a zastavenie plánovača Quartz.NET

Ďalej budeme musieť implementovať hostenú službu. Hosťovaná služba je trieda, ktorá implementuje rozhranie IHostedService a spúšťa plánovač Quartz. Nasledujúci zoznam kódov ilustruje vlastnú triedu hostovanej služby.

verejná trieda CustomQuartzHostedService: IHostedService

    {

súkromné ​​iba na čítanie ISchedulerFactory schedulerFactory;

súkromné ​​iba na čítanie IJobFactory jobFactory;

súkromné ​​iba na čítanie JobMetadata jobMetadata;

verejné CustomQuartzHostedService (ISchedulerFactory

schedulerFactory,

JobMetadata jobMetadata,

IJobFactory jobFactory)

        {

this.schedulerFactory = schedulerFactory;

this.jobMetadata = jobMetadata;

this.jobFactory = jobFactory;

        }

public IScheduler Scheduler {get; sada; }

verejná asynchronná úloha StartAsync (CancellationToken CancelToken)

        {

Scheduler = await schedulerFactory.GetScheduler ();

Scheduler.JobFactory = jobFactory;

var job = CreateJob (jobMetadata);

var trigger = CreateTrigger (jobMetadata);

čakaj Scheduler.ScheduleJob (job, trigger, CancelToken);

čaká Scheduler.Start (CancelToken);

        }

verejná asynchronná úloha StopAsync (CancellationToken CancelToken)

        {

čakať na plánovač? .Shutdown (CancelToken);

        }

súkromný ITrigger CreateTrigger (JobMetadata jobMetadata)

        {

vrátiť TriggerBuilder.Create ()

.WithIdentity (jobMetadata.JobId.ToString ())

.WithCronSchedule (jobMetadata.CronExpression)

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

.Build ();

        }

súkromný IJobDetail CreateJob (JobMetadata jobMetadata)

        {

vrátiť JobBuilder

.Create (jobMetadata.JobType)

.WithIdentity (jobMetadata.JobId.ToString ())

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

.Build ();

        }

    }

Nasledujúci útržok kódu zobrazuje úplný kód metódy ConfigureServices triedy Startup.

public void ConfigureServices (služby IServiceCollection)

{

services.AddControllers ();

služby.AddSingleton ();

služby.AddSingleton ();

služby.AddSingleton ();

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

services.AddHostedService ();

}

A to je všetko, čo musíte urobiť! Pri spustení aplikácie zistíte, že metóda Execute () triedy NotificationJob sa spúšťa každých 10 sekúnd.

Quartz.NET je dobrá voľba pre implementáciu plánovačov do vašich aplikácií. Môžete využiť výhodu perzistencie v Quartz.NET na ukladanie vašich úloh do databázy, ako napríklad SQL Server, PostgreSQL alebo SQLite.

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