DUICUO

Quartz.Net タスク スケジューリング フレームワークをすぐに習得し、スケジュールされたタスクを簡単に実装します。

Quartz.Net アーキテクチャ設計

Quartz.Net のアーキテクチャは、次のような従来の MVC (モデル - ビュー - コントローラ) パターンを採用しています。

  • モデル: アプリケーションのデータと状態を表します。Quartz.Netでは、モデルはジョブとトリガーで構成され、スケジューラによってスケジュールされます。
  • View: ユーザーとインタラクションする部分を表します。Quartz.Netでは、ViewはSchedulerフレームワークによって提供されるAPIとUIコンポーネントで構成されます。
  • コントローラー: ユーザー入力の処理とモデルおよびビューの更新を担当します。Quartz.Netでは、コントローラーはスケジューラーコントローラーで構成されます。
  1. Quartz.Net コンポーネントモジュール

Quartz.Net には次のコンポーネント モジュールが含まれています。

  • スケジューラ:ジョブのスケジュールと実行を担当します。スケジューラは、ジョブとトリガーのスケジュールリストを管理し、定義された条件に基づいてスケジュールするジョブを選択します。
  • ジョブ: 実行されるタスクを表します。Quartz.Netでは、ジョブはIJobインターフェースを実装する必要があります。
  • トリガー: ジョブを実行するタイミングを定義します。Quartz.Net は、シンプルトリガーや Cron トリガーなど、いくつかの種類のトリガーを提供しています。
  • JobDetail: ジョブのクラス、名前、説明、ジョブの実行に必要なその他のデータなど、ジョブに関する詳細情報を表します。
  • JobExecutionContext: ジョブ実行中にアプリケーションおよび Quartz.Net フレームワークと対話するために必要なコンテキスト情報を提供します。
  • SchedulerFactory: Scheduler を作成するために使用されるファクトリ クラス。

Quartz.Net を .NET Core プロジェクトに統合するには、次の手順に従います。

Quartz.Net NuGetパッケージをインストールする

Visual Studio の NuGet パッケージ マネージャーで Quartz.Net パッケージを検索してインストールするか、コマンド ライン (dotnet add package Quartz) 経由でインストールします。

ジョブクラスを作成する

プロジェクト要件に基づいて対応するジョブ クラスを作成し、IJob インターフェイスを実装します。例:

 public class MyJob : IJob { public async Task Execute(IJobExecutionContext context) { await Console.Out.WriteLineAsync("Hello, Quartz.Net!"); } }

スケジューラを構成する

Scheduler を作成し、ジョブとトリガーを追加するには、Startup.cs ファイルに構成コードを追加します。

 public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IJobFactory, SingletonJobFactory>(); services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>(); services.AddSingleton(new JobSchedule( jobType: typeof(MyJob), cronExpression: "0/5 * * * * ?")); // 每5秒执行一次services.AddHostedService<QuartzHostedService>(); } public class JobSchedule { public Type JobType { get; } public string CronExpression { get; } public JobSchedule(Type jobType, string cronExpression) { JobType = jobType; CronExpression = cronExpression; } } public class SingletonJobFactory : IJobFactory { private readonly IServiceProvider _serviceProvider; public SingletonJobFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) { return (IJob)_serviceProvider.GetService(bundle.JobDetail.JobType); } public void ReturnJob(IJob job) { // do nothing } } public class QuartzHostedService : IHostedService { private readonly ISchedulerFactory _schedulerFactory; private readonly IJobFactory _jobFactory; private readonly IEnumerable<JobSchedule> _jobSchedules; public QuartzHostedService( ISchedulerFactory schedulerFactory, IJobFactory jobFactory, IEnumerable<JobSchedule> jobSchedules) { _schedulerFactory = schedulerFactory; _jobFactory = jobFactory; _jobSchedules = jobSchedules; } public async Task StartAsync(CancellationToken cancellationToken) { var scheduler = await _schedulerFactory.GetScheduler(cancellationToken); scheduler.JobFactory = _jobFactory; foreach (var jobSchedule in _jobSchedules) { var jobDetail = JobBuilder.Create(jobSchedule.JobType).Build(); var trigger = TriggerBuilder.Create() .WithCronSchedule(jobSchedule.CronExpression) .Build(); await scheduler.ScheduleJob(jobDetail, trigger, cancellationToken); } await scheduler.Start(cancellationToken); } public async Task StopAsync(CancellationToken cancellationToken) { var scheduler = await _schedulerFactory.GetScheduler(cancellationToken); await scheduler.Shutdown(cancellationToken); } }

スケジューラの起動と停止

Main 関数でスケジューラを開始します。

 public static async Task Main(string[] args) { var host = CreateHostBuilder(args).Build(); await host.RunAsync(); }

公式サイト: https://www.quartz-scheduler.net/。

公式ドキュメント: https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html。