はじめに
アプリケーションを作成していると、定期的に処理を実行したいということがよくあります。例えば、「毎日1回不要なデータを消す」「定期的にキャッシュしたデータが更新されていないかチェック」といった場合です。こういった場合にはWindowsサービスを利用するなどの方法が取られます。
しかしWebアプリケーションでWindowsサービスを利用する場合、Webサイトのセットアップとは別にサービスを設定する必要があり、メンテナンスの手間がかかります。Webサイト上のスレッドで実行できれば、サービス起動などの手間を減らすことができます。
本稿では、Windowsサービスのような定期的な処理を実行するための機能をASP.NETに組み込む方法を解説します。この機能はWebサイト1つにDBサーバ1台という形での利用を想定しています。大規模Webサイトで複数のWebアプリケーションを同時にホストするような場合はいくつか注意する点が出てきます。それについては最後に注意点として記述します。
対象読者
- ASP.NETが分かる人
- ASP.NETにWindowsサービスのような機能をつけたい人
- シングルトンオブジェクトの設計方法に興味がある人
作成クラス・インターフェイス
IScheduleインターフェイス
実行させたいジョブが実装するべきメソッドをISchedule
に定義します。定義するメソッドは3つです。
IsTrigger
はジョブを実行するかどうかを示す値を取得するメソッドです。Execute
は実際に実行される処理を実装します。IsFinish
はジョブをもう1度実行するかどうかを示す値を取得します。実際にジョブとして登録するためにはこのインターフェイスを実装する必要があります。
ScheduleServiceクラス
ScheduleService
クラスは1分ごとに登録されたジョブのうち、実行する必要があるジョブを実行します。実行し終わったジョブのうち、次回実行する必要がないと判断されたジョブの登録を解除します。
DataDeleteTaskクラス
ジョブのクラス図は以下のようになります。DataDeleteDataクラスを例にして説明します。
このクラスはIScheduleインターフェースを実装しています。実行する必要の有無を判定するメソッドがIsTrigger
メソッド、次回実行する必要があるかないかを判定するメソッドがIsFinish
メソッドとなります。Execute
メソッドが実際に実行される処理を実装することになります。