C#でQuartz.Netを操作する方法
アプリケーションで作業するときは、多くの場合、事前定義された時間間隔でバックグラウンドで特定のタスクを実行する必要があります。アプリケーションでジョブをスケジュールすることは困難であり、Quartz、Hangfireなどの利用可能な多くのフレームワークから選択できます。
Quartz.Netは長い間使用されており、Cron式の操作をより適切にサポートします。Hangfireは、ASP.Netの要求処理パイプラインを利用してジョブを処理および実行するさらに別のジョブスケジューラフレームワークです。
Quartz.Netは、人気のあるJavaジョブスケジューリングフレームワークの.Netポートです。これは、最小のアプリから大規模なエンタープライズシステムまで使用できるオープンソースのジョブスケジューリングシステムです。Quartz.Netの公式ウェブサイトは次のように述べています。「Quartz.Netは、最小のアプリから大規模なエンタープライズシステムまで使用できる、フル機能のオープンソースのジョブスケジューリングシステムです。」
入門
Quartz.Netは、Quartz公式Webサイトのダウンロードセクションからインストールできます。Visual StudioIDEのパッケージマネージャーウィンドウからQuartz.Netをインストールすることもできます。
Quartzの3つの主要なコンポーネントは、ジョブ、トリガー、およびスケジューラーです。つまり、Quartz.Netでジョブを作成およびスケジュールするには、スケジューラー、トリガー、およびジョブが必要です。ジョブは実行する必要のあるタスクを示しますが、トリガーはジョブの実行方法を指定するために使用されます。スケジューラーは、ジョブをスケジュールするコンポーネントです。ジョブとトリガーをスケジューラーに登録する必要があることに注意してください。
C#でのQuartz.Netのプログラミング
ジョブを作成するには、IJobインターフェイスを実装するクラスを作成する必要があります。ちなみに、このインターフェイスはExecuteメソッドを宣言しています。このメソッドはカスタムジョブクラスに実装する必要があります。次のコードスニペットは、Quartz.Netライブラリを使用してカスタムジョブクラスを設計するためにIJobインターフェイスを実装する方法を示しています。
public class Job : IJob
{
public void Execute(IJobExecutionContext context)
{
//Sample code that denotes the job to be performed
}
}
JobクラスのExecuteメソッドの簡単な実装を次に示します。アプリケーションのニーズに合わせてカスタムジョブクラスを設計するのはあなたに任せます。以下に示すコードスニペットは、現在のDateTime値をテキストとしてファイルに書き込みます。この実装はスレッドセーフではないことに注意してください。説明のみを目的としています。
public void Execute(IJobExecutionContext context)
{
using (StreamWriter streamWriter = new StreamWriter(@"D:\Log.txt", true))
{
streamWriter.WriteLine(DateTime.Now.ToString());
}
}
ジョブクラスをすでに定義したので、独自のジョブスケジューラクラスを作成し、ジョブのトリガーを定義する必要があります。トリガーには、ジョブのメタデータがcron式として含まれます。このリンクにアクセスして、cron式を生成できます。
さて、ジョブはどのようにスケジュールされていますか?さて、あなたのジョブをスケジュールする責任があるジョブスケジューラと呼ばれるコンポーネントがあります。基本的に、ジョブスケジューラを利用して、ジョブの実行をスケジュールできます。次のコードリストは、ジョブのトリガーを定義してから、ジョブとトリガーをジョブスケジューラに登録する方法を示しています。
public class JobScheduler
{
public static void Start()
{
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
IJobDetail job = JobBuilder.Create().Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("Job", "")
.WithCronSchedule("0 0/1 * 1/1 * ? *")
.StartAt(DateTime.UtcNow)
.WithPriority(1)
.Build();
scheduler.ScheduleJob(job, trigger);
}
}
上記のコードリストを参照してください。トリガーインスタンスを作成するときに、トリガーの名前とグループがどのように指定されているかに注意してください。必要なcron式を使用してジョブのトリガーが定義および構成されると、トリガーはジョブスケジューラに登録されます。
毎秒起動され、無期限に繰り返されるトリガーを作成することもできます。これは、このようなトリガーを作成する方法を示すコードスニペットです。
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("Job", "")
.StartNow()
.WithSimpleSchedule(s => s
.WithIntervalInSeconds(10)
.RepeatForever())
.Build();
スケジューラーを開始するために、必ずしもWindowsサービスが必要なわけではありません。ASP.Net Webアプリケーションを使用している場合は、Global.asaxファイルのApplication_Startイベントを利用してから、以下のコードスニペットに示すようにJobScheduler.Start()メソッドを呼び出すことができます。
public class Global : HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
JobScheduler.Start();
}
}
JobSchedulerは、以前に設計したカスタムクラスの名前であることに注意してください。Quartz.Netを利用して、ジョブを永続ストレージに保存することもできます。つまり、ジョブをデータベースに永続化することもできます。サポートされているすべてのジョブストアのリストは、ここから確認できます。