安裝
NuGet 上有幾個可用的Hangfire 的軟件包。如果在ASP.NET應用程序中安裝HangFire,並使用Sql Server作為存儲器,那么請在Package Manager Console窗口中鍵入以下命令:
PM> Install-Package Hangfire
配置
在安裝package后,添加或者更新以下幾行到Owin Startp類:
using Hangfire; // ... public void Configuration(IAppBuilder app) { GlobalConfiguration.Configuration.UseSqlServerStorage("<connection string or its name>"); app.UseHangfireDashboard(); app.UseHangfireServer(); }
需要配置授權
默認情況下,只有本地有權限訪問Hangfire儀表板。如果需要授權遠程訪問,那么儀表板的授權必須進行相應的配置。
然后打開Hangfire儀表板來測試您的配置。編譯項目並在瀏覽器中打開以下URL:
1
|
http:
//<your-site>/hangfire
|
用法
添加工作
HangFire處理不同類型的后台任務,並且使用一個獨立的上下文環境調用他們。
Fire-And-forget(發布/訂閱)
這是一個主要的后台任務類型,持久化消息隊列會去處理這個任務。當你創建了一個發布/訂閱任務,該任務會被保存到默認隊列里面(默認隊列是"Default",但是支持使用多隊列)。多個專注的工作者(Worker)會監聽這個隊列,並且從中獲取任務並且完成任務。
BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget"));
延遲
如果想要延遲某些任務的執行,可以是用以下任務。在給定延遲時間后,任務會被排入隊列,並且和發布/訂閱任務一樣執行。
BackgroundJob.Schedule(() => Console.WriteLine("Delayed"), TimeSpan.FromDays(1));
循環
按照周期性(小時,天等)來調用方法,請使用RecurringJob
類。在復雜的場景,您可以使用CRON表達式指定計划時間來處理任務。
RecurringJob.AddOrUpdate(() => Console.WriteLine("Daily Job"), Cron.Daily);
連續
連續性允許您通過將多個后台任務鏈接在一起來定義復雜的工作流。
var id = BackgroundJob.Enqueue(() => Console.WriteLine("Hello, ")); BackgroundJob.ContinueWith(id, () => Console.WriteLine("world!"));
釋放
Hangfire將您的任務保存到持久化庫匯總,並且以可靠的方式處理它們。這意味着,你可以中斷Hangfire Worder的線程,重新加載應用程序域,或者終止程序,即使這樣您的任務仍會被處理。只有在你代碼的最后一行執行完成,Hangfire才會標記這個任務完成。並且知道任務可能在最后一行代碼執行之前失敗。它包含多種 自動-重試機制,它可以自動處理在存儲或代碼執行過程中發生的錯誤。
這對於通用托管環境(如IIS Server)非常重要。它們可以包含不同的優化,超時和錯誤處理代碼(可能導致進程終止)來防止不好的事情發生。如果您沒有使用可靠的處理和自動機制,您的工作可能會丟失。您的最終用戶可能無限期等待某些任務,如電子郵件,報告,通知等。
但是當您的存儲空間破損時,Hangfire無法做任何事情。請為您的存儲使用不同的故障切換策略,以保證在發生災難時處理每個作業。
以上文章來源:https://www.cnblogs.com/tangxing/p/6669051.html
原文地址:http://docs.hangfire.io/en/latest/quick-start.html
拓展內容
時區配置問題:
RecurringJob.AddOrUpdate(() => WriteLog("xcxxx"), Cron.Daily(14,00), TimeZoneInfo.Local); //注意最小單位是分鍾,
//TimeZoneInfo.Local 使用服務器本地時間
權限配置問題:
OwinStartup 下 Configuration文件
GlobalConfiguration.Configuration.UseSqlServerStorage("HangfireDBConnection"); app.UseHangfireServer();
//app.UseHangfireDashboard(); //無權限控制 var options = new DashboardOptions { Authorization = new[] { new HangfireAuthorizationFilter() } }; app.UseHangfireDashboard("/hangfire", options); //采用權限控制
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter { //這里需要配置權限規則 public bool Authorize(DashboardContext context) { return new UserService().IsAdmin(); //True 可以訪問,False拒絕訪問,結合系統原有邏輯設置 } }