一.簡述
Hangfire做爲一款高人氣且容易上手的分佈式後臺執行服務,支持多種數據庫。在.net core的環境中,由Core自帶的DI管理着生命週期,免去了在NF4.X環境中配置always running的麻煩,真正作到開箱即用。javascript
二.安裝
Hangfie官方支持是MsSql和redis,除此以外,可供選擇的還有PostgreSql和Mongo。
在應用入口項目須要引用Hangfire.AspNetCore和特定持久庫,好比使用了MsSql數據庫的Hangfire.SqlServer。
而在其餘項目(好比bll層的項目),只需引用基礎的Hangfire.Core就能夠了。html
三.Startup配置
1.注入Hnagfire服務
services.AddHangfire(x => x.UseSqlServerStorage("<connection string>"));
2.可選配置
啓動Hangfire服務和對應的web面板以下:java
app.UseHangfireServer();//啓動Hangfire服務 app.UseHangfireDashboard();//啓動hangfire面板
細心的觀衆可能會發現,這兩個方法都有可選參數,能夠提供更多的配置。git
2.1 配置任務屬性
var jobOptions = new BackgroundJobServerOptions { Queues = new[] { "test","default" },//隊列名稱,只能爲小寫 WorkerCount = Environment.ProcessorCount * 5, //併發任務數 ServerName="hangfire1",//服務器名稱 }; app.UseHangfireServer(jobOptions);
Queues
要處理的隊列列表
對於有多個服務器同時鏈接到數據庫,Hangfire會認爲他們是分佈式中的一份子。現實中不一樣服務器每每存在着差別,這個時候就須要合理配置服務器(應用)的處理隊列,舉兩個例子:
1.對於服務器性能差別的處理,有100個A任務和50個B任務須要處理,假設A服務器的性能是B服務器的兩倍,若是不配置隊列,那麼會平分任務給兩個服務器。若是咱們只讓B服務器處理B任務,而A服務器同時處理兩種任務,這樣B就能減小一些壓力。github
2.對於服務器能力差別的處理,假設A服務器能處理A和B兩種任務,B服務器只能處理B任務(沒有處理A任務的方法或對象),若是不配置隊列,默認會讓B也執行A任務,從而產生錯誤。反面一想,若是A服務器和B服務器都有共同的接口,B服務器不實現接口的方法,發起一個專屬於A服務器隊列的任務,而A服務器經過注入實現接口的方法,能夠達到傳遞任務的效果。web
WorkerCount
併發任務數,超出併發數將等待以前的任務完成
默認的併發任務數是線程(cpu)的5倍,若是IO密集型任務多而CPU密集型的任務少,能夠考慮調高併發任務數。redis
以上是我用到的,固然還有其餘配置參數等着你去開發。docker
2.2.配置訪問權限
在實際生產中,咱們可能不但願任何人均可以訪問面板,或暫停執行某些任務,這時就須要重寫面板的權限了。默認狀況下,只有本地訪問權限才能使用Hangfire儀表板。因此須要重寫控制面板,以便遠程訪問。數據庫
var options = new DashboardOptions { Authorization = new[] { new HangfireAuthorizationFilter() } }; app.UseHangfireDashboard("/hangfire", options);
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter { //這裏須要配置權限規則 public bool Authorize(DashboardContext context) { return true; } }
三.使用(官方文檔)
Fire-and-forget
直接將任務加入到待執行任務隊列Delayed
在當前時間後的某個時間將任務加入到待執行任務隊列Recurring
週期性任務,每個週期就將任務加入到待執行任務隊列Continuations
顧名思義,繼續執行任務bash
1.簡單入門
using (var connection = JobStorage.Current.GetConnection()) { var storageConnection = connection as JobStorageConnection; if (storageConnection != null) { //當即啓動 var jobId = BackgroundJob.Enqueue(()=>Console.WriteLine("Fire-and-forget!")); } }
固然,不單單隻有靜態方法能夠執行,Hangfire的任務也是支持.net core的依賴注入的,會構造一個對象並執行對應的方法。
BackgroundJob.Enqueue<SomeClass>(i => i.SomeMethod(someParams))
2.進階功能
2.1設置任務隊列
[Queue("test")] public void TestQueue() { }
對於非週期任務,只須要在執行的方法添加Queue的特性就能指定該任務讓特定的隊列服務器處理。
而週期任務,則須要先聲明:
RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring!"),Cron.Daily,queue:"test");
2.2 使用日誌過濾器(點我查看)
Hangfire支持自定義過濾器,能夠對任務在建立時、執行中、執行後等等狀態執行特定特定的操做。
//特定方法過濾器 [LogEverything] public static void Send() { } //全局過濾器 GlobalJobFilters.Filters.Add(new LogEverythingAttribute());
四.中文文檔
hangfire是一個不錯的開源後臺任務組件,官方沒有中文文檔,因此簡單地用谷歌機翻修改了一下。
文檔在github的地址:https://github.com/jonechenug/Hangfire-Chinese-Doc
docker運行並訪問本地8080端口:
docker run --restart always --name hangfire -d -p 8080:80 daocloud.io/koukouge/hangfirezhdoc