Hangfire 是一套支援在 ASP.NET MVC 站台跑背景作業或排程的好用程式庫,可以將作業丟到背景執行、延遲執行或排定時間定期啟動,並且網頁管理介面、支援失敗重試等功能。如使用資料庫作為任務儲存區,即使網站重啟工作也不會遺失,功能十分強大。Hangfire 開源且可免費用於商業用途,付費版 Hangfire Pro 則多了批次作業中斷接續執行、批次作業流程設計、Redis 支援、效能監控計數器等進階功能。關於 Hangfire 的基本使用 MVP Bruce 有篇淺顯易懂的介紹文:KingKong Bruce記事- 使用Hangfire處理ASP.NET MVC-Web API長時間與排程工作,在此不多贅述。

Hangfire 的架構很靈活,儲存資料來源被拆成獨立介面,支援各式資料庫。SQL Server Storage 被包在官方專案裡,算是預設的儲存資料庫選擇,且支援 SQL Server 2008 以上的各版本 SQL (包含免費版 SQL Server Express LocalDB 以及 SQL Azure )。不過即便用 LocalDB 還是有 SQL Server Express 的安裝部署需求,想起最近在幾個小專案用得很開心的 SQLite,查了一下已有好心人寫好 Hangfire.SQLite 套件,嘿,來試試 Hangfire + SQLite 好了。

NuGet 上的 Hangfire 程式包很完整,會自動帶入所有必要程式元件,安裝挺無腦的。

由於打算用 SQLite 當作 Hangfire 資料庫,需要額外加裝 Hangfire.SQLite。

我選擇不碰 Global.asa.cs 而是在 App_Start 資料夾加入 OWIN Startup 類別設定 Hangfire。(延伸閱讀:開發筆記-OWIN 是什麼?)

using Hangfire;
using Hangfire.Dashboard;
using Hangfire.SQLite;
using Microsoft.Owin;
using Owin;
using System.Web.Hosting;
 
[assembly: OwinStartup(typeof(MyApp.Startup))]
namespace MyApp
{
    public class Startup
    {
        private static string SqliteDbPath = 
            HostingEnvironment.MapPath("~/App_Data/Hangfire.sqlite");
 
        public void Configuration(IAppBuilder app)
        {
            GlobalConfiguration.Configuration
                //記得連線字串結尾要補上「;」
                //不然會被視為 config 檔連線設定名稱
                .UseSQLiteStorage($"Data Source={SqliteDbPath};");
 
            app.UseHangfireDashboard();
            app.UseHangfireServer();
        }
    }
}

有兩件注意事項:

  1. 連線字串結尾需加「;」,不然會被當成 web.config 的 ConnectionString 設定名稱。
  2. SQLite 資料檔如要放在 App_Data,記得要開寫入權限。

如果一切順利,輸入 /hangfire/ URL 會看到 Hangfire 儀表板,大功告成:

Hangfire 第一次執行時會自動在資料庫建好 Schema,用 DB Browser for SQLite 開啟 App_Data/Hangefire.sqlite,可以看到資料表都已建好。

題外話: 原本我慣用的 SQLite Manager Firefox 套件已不相容 Firefox 57+,看了 Github 討論,似與 Firefox 修改 API 規格有關,作者也無力回天。現在可改用另一套開源工具 - DB Browser for SQLite

儀表板有個小問題,介面的簡體中文看起來很不習慣,經調查它是依據 Thread CultureInfo 自動載入對應的語系資源檔,有個 bin\zh\Hangfire.Core.resources.dll 提供中文字串資源(不分繁簡,但內容為簡體)。若不想看簡體,有幾種解決辦法:

  1. 補上繁體中文版 Hangfire.Core.resouces.dll
    這是最正統的解法,但我沒找到現成版本
  2. 刪除 \bin\zh\Hangfire.Core.resources.dll
    沒有中文資源檔就會變回英文,缺點是每次重新編譯會再冒出來
  3. 修改 web.config 將 UI 語系調成英文
     <system.web>
        <globalization uiCulture="en-US" />
      </system.web>

    缺點是會影響整個網站的語系設定

我先修改 web.config 應急,改完儀表板即變回英文。但理論上補上繁體中文資源檔才是王道,感覺也不算太難,過陣子再當成 Coding4Fun 題目練習好了。

另外,Hangfire 很聰明,會自己靠 Relection 尋找專案有無啟用 NLog、Log4Net、Elmah... 等 Log 機制。如果有就自動輸出 Log,完全不需設定,這個巧妙設計讓我小小驚喜了一下,值得學起來。

2023-01-08 更新:ASP.NET Core 整合 Hangfire 範例

Tutorial of using SQLite as Hangfire database.


Comments

# by Alex

fork repository 增加 Hangfire/tree/master/src/Hangfire.Core/Dashboard/Content/resx/Strings.zh-tw.resx ?

# by Jeffrey

to Alex, 感謝。其實 PO 完文沒多久就忍不住手癢翻好繁體中文版了,正在邊用邊改微調中,擇日分享。

# by 二狗

不错不错 成功使用 比老外写得好

Post a comment