[Hangfire]01-使用hangfire來執行background job

最近在工作上使用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上下載最新版的套件

  • 接著新增一個owinstartup.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)

最後附上我的實作範例程式碼

HangfireSample