Hangfire 排程套件安裝
Hangfire簡介
可以很方便的用來執行backgroud job,不需要額外的windows service。支援幾種類型的job
- Fire-and-forgot jobs: 站台啟動後自動執行
一次
- Delayed jobs: 可設定時間區間,每間格時間區間執行
一次
- Recurring jobs: 可設定
Cron
敘述,並重複執行多次
- Continuations: 在某個job執行完後接續執行
這裡會介紹兩種方式:
第一種: Hangfire的排程的工作任務會存放在MemoryStorage
第二種: Hangfire的排程的工作任務會存放在 SQLite
第一步:到NUGET安裝 Hangfire.MemoryStorage套件
或者 PM> Install-Package Hangfire.MemoryStorage
第二步:到NUGET安裝 Microsoft.Owin.Host.SystemWeb套件
PM> Install-Package Microsoft.Owin.Host.SystemWeb
第三步: 在專案加入Owin Startup class(注意,檔案名稱請改為Startup.cs而不是預設的Startup1.cs),並在裡面加入:
只需要將 Configuration內容複製貼上,並且將 hangfireTest改成專案名稱
[assembly: OwinStartup(typeof(專案名稱.Startup))]
第四步:執行專案
只需在網址後面加入/hangfire/就可以查看排程
https://localhost:44375/hangfire/
可以撰寫API來測試一下,上述四種backgroud job方法
當在Control裡面新增WebAPI的時候會跳出一個說明文件
Visual Studio 已將 ASP.NET Web API 2 的 整組 相依性新增至專案 'hangfireTest'。專案中的 Global.asax.cs 檔案需要其他變更,才能啟用 ASP.NET Web API。1. 新增下列命名空間參考:using System.Web.Http;using System.Web.Routing;2. 如果程式碼尚未定義 Application_Start 方法,請新增下列方法:protected void Application_Start(){}3. 將以下幾行新增至 Application_Start 方法的開頭處:GlobalConfiguration.Configure(WebApiConfig.Register);
因此我們必須將Global.asax.cs先做修正
特別注意GlobalConfiguration.Configure(WebApiConfig.Register);
必須放在開頭處
方法一: 站台啟動後自動執行一次
這裡假設Send()方法是一個需要長時間處理的工作,透過BackgroundJob.Enqueue()
把此任務送到背景去處理。你能發現,此方法會立即回應你Http 200狀態碼,並不會造成鎖定。
筆者用Fiddler同時間打超過1000筆請求(任務)進去,Hangfire都能秒殺且輕鬆完成。(註,這是在本機打,所以特別快:D)
方法二: 可設定時間區間,每間格時間區間執行一次
BackgroundJob.Schedule()
就是希望目前的任務延後執行,不過注意,以範例來說,我會得到兩個訊息,兩個訊息前後差3秒,但輸出的訊息時間會是一樣。也就是說,DateTime.Now
在送入背景等待時就已經執行完畢,而不是3秒後才被執行。
方法三: Recurring jobs: 可設定Cron
敘述,並重複執行多次
RecurringJob.AddOrUpdate()
是重頭戲,也就是我們以前我們在網頁上難以處理的定時、排程的處理,Cron
關鍵字如果你有玩過Linux的人應該都很熟悉,可以設置:分、小時、日、週、月、年。如果要更進一步的設置詳細時間,可以透過方法的多載來設定,例如:Daily(int hour, int minute);
可設定每天的幾點幾分來定時觸發。如果你習慣Cron表示式(CRON expressions),例如:"0 12 * */2"
,Hangfire也支援。
也可以進入此網站看Cron表示式定義
參考文章:
- https://bryanyu.github.io/2018/09/03/Hangfire01/
- https://blog.darkthread.net/blog/hangfire-sqlite/
- https://blog.kkbruce.net/2015/09/hangfire-aspnet-mvc-webapi.html#.XYm7xugzaUl
另一個排程管理平台Quartz.net