最近在工作上使用hangfire來執行一些background job作業
以往background job都採用console應用程式搭配Task manager實作
這次選擇使用hangfire
這個系列文會分享如何使用與設定hangfire
Hangfire簡介
可以很方便的用來執行backgroud job,不需要額外的windows service。支援幾種類型的job
- Fire-and-forgot jobs: 站台啟動後自動執行
一次
- Delayed jobs: 可設定時間區間,每間格時間區間執行
一次
- Recurring jobs: 可設定
Cron
敘述,並重複執行多次
- Continuations: 在某個job執行完後接續執行
安裝與啟動
首先先新增一個 .NET MVC站台,並從Nuget上下載最新版的套件
接著新增一個
owin
的startup.cs
,用來增加hangfire的儀錶板與資料庫連線設定[assembly: OwinStartup(typeof(HangfireSample.Startup))] namespace HangfireSample { public class Startup { public void Configuration(IAppBuilder app) { var connectionString = ConfigurationManager.ConnectionStrings["HangfireConnection"].ConnectionString; GlobalConfiguration.Configuration.UseSqlServerStorage(connectionString); app.UseHangfireDashboard(); app.UseHangfireServer(); } } }
新增job與執行
新增上述四種job
public class JobConfig
{
public static void Register()
{
// fire and got:站台啟動後只會執行一次
BackgroundJob.Enqueue(() => Console.WriteLine("Fire and forgot"));
// delay: 設定時間間隔,每隔時間間隔執行一次
BackgroundJob.Schedule(() => Console.WriteLine("Delayed"), TimeSpan.FromDays(1));
// recurring: 設定cron敘述,重複執行多次
RecurringJob.AddOrUpdate(() => Console.WriteLine("Daily Job"), Cron.Daily);
// continue: 在某個job執行完後接續執行
var id = BackgroundJob.Enqueue(() => Console.WriteLine("Hello, "));
BackgroundJob.ContinueWith(id, () => Console.WriteLine("world!"));
}
}
儀錶板會顯示目前job的執行狀況
也可以直接手動觸發定期的job,讓他馬上執行
如果有job發生失敗的狀況,固定時間他會自己重試,直到重試次數滿了為止
這個功能非常好用,以往寫console應用程式,在程式發生exception時,要撰寫自動回覆的程式碼,但使用hangfire之後,利用它會自動重試的機制,讓我們在開發上比較便利
這些job的資料都會存放在DB(或者是其他設定的storage)
最後附上我的實作範例程式碼