はじめに
ASP.NET上で「WebBackgrounder」を使って、バックグラウンドタスクを実装
現在、ASP.NETでWebシステムを構築中で、利用者の登録時にバックグラウンド処理が
必要になったので、何かないか探していたところ、「WebBackgrounder」というパッケージがあったので、使ってみました。
この「WebBackgrounder」というパッケージは、MicrosoftのWeb開発のベストプラクティス-ASP.NET では行わないことと、その代わりに行うことの記事で紹介されていたので、使えるかなあと
↓
https://docs.microsoft.com/ja-jp/aspnet/aspnet/overview/web-development-best-practices/what-not-to-do-in-aspnet-and-what-to-do-instead
やりたいことは、以下の利用者登録処理で、本登録の有効時間(72時間)を設定し、
バックグラウンドタスクで、有効時間が過ぎた仮登録の情報を削除する処理です。
利用者がWebシステムを使うため、利用者登録を行い、仮登録を行う。
↓
利用者に本登録用のメールを送る
↓
利用者がメールからのURLにアクセスして本登録を行う。
WebBackgrounderの入手
WebBackgrounderをnugetから入手。バージョン0.2.0が最新ですが、2012年から更新されていません。枯れた技術です。
↓
https://www.nuget.org/packages/WebBackgrounder
参考ソース
以下、参考ソースです。
Global.asax.cs(抜粋)
まず初めに、Webアプリ開始と終了時に、WebBackgrounderの開始と終了処理を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { GlobalConfiguration.Configure(WebBackgrounderSetup.Start); } protected void Application_End(object sender, EventArgs e) { GlobalConfiguration.Configure(WebBackgrounderSetup.Shutdown); } } |
WebBackgrounderSetup.cs(抜粋)
WebBackgrounderSetupでは、任意のジョブクラスを登録します。ジョブクラスでは、
任意の周期でタスクが実行できます。今回は1分周期でジョブが実行されます。
今回はジョブが1つだけですが、任意の周期でジョブが登録できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public static class WebBackgrounderSetup { private static readonly JobManager jobManager = CreateJobWorkersManager(); public static void Start(HttpConfiguration config) { jobManager.Start(); } public static void Shutdown(HttpConfiguration config) { jobManager.Dispose(); } private static JobManager CreateJobWorkersManager() { var jobs = new IJob[] { new UserStatusUpdateJob("UserStatusUpdateJob", TimeSpan.FromMinutes(1)), }; var coordinator = new SingleServerJobCoordinator(); var manager = new JobManager(jobs, coordinator); return manager; } } |
UserStatusUpdateJob.cs(抜粋)
ジョブクラスでは、WebBackgrounder.Jobクラスを継承したクラスを実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class UserStatusUpdateJob : Job { public UserStatusUpdateJob(string name, TimeSpan interval) : base(name, interval) { } public override System.Threading.Tasks.Task Execute() { return new Task(() => { UpdateStats(); }); } public void UpdateStats() { // 有効時間が過ぎた仮登録の情報を削除処理 } } |