Visual WebGUI + Hangfire 做 Background Jobs

好多時會遇到客戶希望可以指定一個時間電腦系統能夠自動向有關人仕發出附有某個 report 嘅電子郵件(例如月結單),又或者有一啲功能要用比較長嘅 processing time,導致畫面出現 Timeout Error(例如 migrate 舊資料至新平台),以上嘅情況就可以用 Hangfire 搞掂!

 

首先建立一個新嘅 Visual WebGUI project,我用 VS 2015 做,project 叫 VGW1。 然後用 NuGet Package Manager 加上入 Hangfire,衹需要加一個:Hangfire 如圖,佢會自動加入其他 plugins。
嚟睇睇有咩 plugins?Hangfire x 2、Owin x 3,我用 MS SQL 所以直接用 Hangfire.SqlServer,如果你用 MySql 之類就要再加 Hangfire plugin。 packages.config 清楚顯示加咗嘅 plugins。
跟手就係要加個 App Init 嚟 initialize Hangfire,Visual WebGUI 喜歡用 Global.asax 用 Application_Start() 做(如圖選用 Global Application Class ),不過 Hangfire 就喜歡用 Startup.cs,所以我選用 OWIN Startup Class。 Line 25 係最簡單嘅方法,我用復雜少少嘅,可以自己決定個 SQL Table 嘅 Schema Name(default 係 Hangfire)唔使同其他人嘅 Tables 撈亂。
Web.Config 要加一行參數如圖,如果你想用 Global.asax 就要 set 做 false。 我個 connection string,對應 Startup.cs,比你參考下。
準備好哂,去改個 Form1,我用一個 label,一個 textbox,再加一個 button。 button.click 會將個 textbox 轉為 sec,再提交 3 個 Hangfire jobs:
Enqueue SendEmail
Schedule SendEms
RecurringJob.AddOrUpdate
Debug run 出現哩個畫面。 去 SQL Server 查下,會到新加嘅 Hangfire Tables。
Hangfire 提供嘅 management console,喺 http://localhost:port/hangfire,全零,一個 Server,一切正常。 開始測試,我用 60 秒。
Ok prompt,即係 run 完。 console 顯示一個 Recurring Job 兩個 Succeeded,我手腳慢,兩個 BackgroundJob 都已經完成,😅
去深入睇下兩個已經完成嘅 jobs,有 Total Duration,即係執行隻 job 所花嘅時間。 SendMail 詳細資料,連個 parameter 都有記錄。
RecurringJobs 有顯示 Next execution 預計下次執行時間,唔係好清楚,不過已經算唔錯! 我再用 120 秒玩一次。
今次睇到一個執行中,一個排緊隊,Recurring 依然係得一個。 Recurring Job 點解得一隻?因為我用同一個 RecurringJobId,Hangfire 真係識 AddOrUpdate,佢 update 同 Id 嘅 job。

*** 完 ***