Programování

Jak naplánovat úlohy pomocí Quartz.NET v ASP.NET Core

Při práci na webových aplikacích budete často muset provádět určité úkoly na pozadí. V některých případech se bude jednat o úkoly, které by měly být prováděny v předdefinovaných časových intervalech.

Quartz.NET je otevřený port .NET v populárním rámci pro plánování úloh Java. Používá se dlouho a poskytuje vynikající podporu pro práci s výrazy Cron. Více o Quartz.NET se můžete dozvědět z dřívějšího příspěvku zde.

Tento článek představuje diskusi o tom, jak můžeme s Quartz.NET v ASP.NET Core plánovat úlohy na pozadí.

Chcete-li pracovat s příklady kódu uvedenými v tomto článku, měli byste mít ve svém systému nainstalovanou Visual Studio 2019. Pokud ještě nemáte kopii, můžete si stáhnout Visual Studio 2019 zde.

Vytvořte projekt rozhraní API ASP.NET Core

Nejprve si vytvořme projekt ASP.NET Core v sadě Visual Studio. Za předpokladu, že je ve vašem systému nainstalovaná sada Visual Studio 2019, postupujte podle níže uvedených kroků a vytvořte nový projekt ASP.NET Core v sadě Visual Studio.

  1. Spusťte Visual Studio IDE.
  2. Klikněte na „Vytvořit nový projekt“.
  3. V okně „Vytvořit nový projekt“ vyberte ze zobrazeného seznamu šablon „Webová aplikace ASP.NET Core“.
  4. Klikněte na Další.
  5. V dalším okně „Konfigurace nového projektu“ zadejte název a umístění nového projektu.
  6. Klikněte na Vytvořit.
  7. V okně „Vytvořit novou webovou aplikaci ASP.NET Core“ vyberte jako běhový modul .NET Core a v rozevíracím seznamu nahoře vyberte ASP.NET Core 2.2 (nebo novější). Budu zde používat ASP.NET Core 3.0.
  8. Vyberte „API“ jako šablonu projektu a vytvořte novou aplikaci API ASP.NET Core.
  9. Ujistěte se, že políčka „Povolit podporu Dockeru“ a „Konfigurovat pro HTTPS“ nejsou zaškrtnuta, protože zde tyto funkce nebudeme používat.
  10. Ujistěte se, že je ověřování nastaveno na „Žádné ověřování“, protože také nebudeme používat ověřování.
  11. Klikněte na Vytvořit.

Tím se vytvoří nový projekt rozhraní API ASP.NET Core v sadě Visual Studio. Vyberte složku řešení Controllers v okně Solution Explorer a kliknutím na „Přidat -> Controller ...“ vytvořte nový řadič s názvem DefaultController.

Chcete-li dále pracovat s Quartzem, měli byste nainstalovat balíček Quartz z NuGet. Můžete to udělat buď prostřednictvím správce balíčků NuGet uvnitř IDE sady Visual Studio 2019, nebo provedením následujícího příkazu v konzole správce balíčků NuGet:

Instalovat balíček Quartz

Quartz.NET úlohy, spouštěče a plánovače

Tři hlavní koncepty v Quartz.NET jsou úlohy, spouštěče a plánovače. Úloha obsahuje kód k provedení úkolu nebo úlohy, která má být provedena. Úlohu představuje třída, která implementuje rozhraní IJob. Spouštěč se používá k určení harmonogramu a dalších podrobností úlohy. Můžete určit výhodu spouštěče a určit, jak má být úloha provedena. Plánovač je komponenta, která je zodpovědná za dotazování a provádění úloh na základě předdefinovaných plánů.

Vytvořte plánovač pomocí Quartz.NET

Je třeba poznamenat, že v aplikaci můžete mít více plánovačů. Pro zjednodušení zde však použijeme pouze jeden plánovač. Následující fragment kódu ukazuje, jak můžete vytvořit instanci plánovače.

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

Po vytvoření plánovače můžete použít následující kód v metodě ConfigureServices souboru Startup.cs a přidat instanci plánovače jako singletonovou službu.

services.AddSingleton (plánovač);

Spusťte a zastavte plánovač pomocí Quartz.NET

Ke spuštění a zastavení plánovače využijeme výhod hostingové služby. Chcete-li to provést, musíte vytvořit třídu, která implementuje rozhraní IHostingService, jak je ukázáno v níže uvedeném fragmentu kódu.

veřejná třída CustomQuartzHostedService: IHostedService

{

soukromé pouze pro čtení IScheduler _scheduler;

public CustomQuartzHostedService (plánovač IScheduler)

        {

_scheduler = plánovač;

        }

veřejná asynchronní úloha StartAsync (CancellationToken CancelToken)

        {

čekat _scheduler? .Start (CancelToken);

        }

veřejná asynchronní úloha StopAsync (CancellationToken CancelToken)

        {

čekat _scheduler? .Shutdown (CancelToken);

        }

 }

Všimněte si, že byste měli zaregistrovat hostovanou službu v kolekci služeb v metodě ConfigureServices pomocí fragmentu kódu uvedeného níže.

services.AddHostedService ();

Zde je aktualizovaná metoda ConfigureServices pro vaši referenci:

public void ConfigureServices (služby IServiceCollection)

{

services.AddControllers ();

var plánovač =

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

services.AddSingleton (plánovač);

services.AddHostedService ();

}

Vytvořte úlohu pomocí Quartz.NET

Jak jsem řekl dříve, práce je třída, která implementuje rozhraní IJob a obsahuje metodu Execute (). Metoda Execute () přijímá instanci typu IJobExecutionContext.

Následující fragment kódu ilustruje třídu úlohy, která obsahuje také asynchronní metodu Execute (). Tato metoda obsahuje kód, který odpovídá úkolu, který má vaše úloha provést.

[DisallowConcurrentExecution]

public class NotificationJob: IJob

    {

soukromé jen pro čtení ILogger _logger;

public NotificationJob (ILogger logger)

        {

_logger = záznamník;

        }

veřejné provedení úkolu (kontext IJobExecutionContext)

        {

_logger.LogInformation ("Hello world!");

vrátit Task.CompletedTask;

        }

    }

Vytvořte továrnu úloh pomocí Quartz.NET

Továrna úloh je třída, která dědí rozhraní IJobFactory a implementuje metody NewJob () a ReturnJob (). Následující fragment kódu lze použít k vytvoření tovární třídy, která může vytvořit a vrátit instanci úlohy.

veřejná třída CustomQuartzJobFactory: IJobFactory

    {

soukromé jen pro čtení IServiceProvider _serviceProvider;

public CustomQuartzJobFactory (IServiceProvider serviceProvider)

        {

_serviceProvider = serviceProvider;

        }

public IJob NewJob (TriggerFiredBundle triggerFiredBundle,

Plánovač IScheduler)

        {

var jobDetail = triggerFiredBundle.JobDetail;

návrat (IJob) _serviceProvider.GetService (jobDetail.JobType);

        }

public void ReturnJob (úloha IJob) {}

    }

Všimněte si, že tato implementace nevyužívá výhod sdružování úloh. Chcete-li použít sdružování úloh, měli byste změnit metodu NewJob () a poté implementovat metodu ReturnJob ().

Vytvořte třídu JobMetadata pro uložení metadat úlohy

K uložení metadat souvisejících s úlohou použijeme vlastní třídu, tj. ID úlohy, název atd. Následující třída představuje třídu metadat úlohy.

veřejná třída JobMetadata

    {

public Guid JobId {get; soubor; }

public Type JobType {get; }

veřejný řetězec JobName {get; }

veřejný řetězec CronExpression {get; }

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

řetězec cronExpression)

        {

JobId = Id;

JobType = jobType;

JobName = jobName;

CronExpression = cronExpression;

        }

    }

Vytvořte hostovanou službu pro spuštění a zastavení plánovače Quartz.NET

Dále budeme muset implementovat hostovanou službu. Hostovaná služba je třída, která implementuje rozhraní IHostedService a spouští plánovač Quartz. Následující výpis kódu ukazuje vlastní třídu hostovaných služeb.

veřejná třída CustomQuartzHostedService: IHostedService

    {

soukromá pouze pro čtení ISchedulerFactory schedulerFactory;

soukromé pouze pro čtení IJobFactory jobFactory;

soukromé jen pro čtení JobMetadata jobMetadata;

public CustomQuartzHostedService (ISchedulerFactory

schedulerFactory,

JobMetadata jobMetadata,

IJobFactory jobFactory)

        {

this.schedulerFactory = schedulerFactory;

this.jobMetadata = jobMetadata;

this.jobFactory = jobFactory;

        }

public IScheduler Scheduler {get; soubor; }

veřejná asynchronní úloha StartAsync (CancellationToken CancelToken)

        {

Scheduler = await schedulerFactory.GetScheduler ();

Scheduler.JobFactory = jobFactory;

var job = CreateJob (jobMetadata);

var trigger = CreateTrigger (jobMetadata);

čekat Scheduler.ScheduleJob (úloha, spoušť, zrušeníToken);

čekat Scheduler.Start (CancelToken);

        }

veřejná asynchronní úloha StopAsync (CancellationToken CancelToken)

        {

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

        }

soukromý ITrigger CreateTrigger (JobMetadata jobMetadata)

        {

vrátit TriggerBuilder.Create ()

.WithIdentity (jobMetadata.JobId.ToString ())

.WithCronSchedule (jobMetadata.CronExpression)

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

.Stavět();

        }

soukromý IJobDetail CreateJob (JobMetadata jobMetadata)

        {

vrátit JobBuilder

.Create (jobMetadata.JobType)

.WithIdentity (jobMetadata.JobId.ToString ())

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

.Stavět();

        }

    }

Následující fragment kódu ukazuje úplný kód metody ConfigureServices třídy Startup.

public void ConfigureServices (služby IServiceCollection)

{

services.AddControllers ();

services.AddSingleton ();

services.AddSingleton ();

services.AddSingleton ();

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

services.AddHostedService ();

}

A to je vše, co musíte udělat! Při spuštění aplikace zjistíte, že metoda Execute () třídy NotificationJob běží jednou za 10 sekund.

Quartz.NET je dobrá volba pro implementaci plánovačů do vašich aplikací. Můžete využít výhody funkce perzistence v Quartz.NET k uložení vašich úloh do databáze, jako je SQL Server, PostgreSQL nebo SQLite.

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