定時任務調度問題,是一個老生常談的問題。網上有許多定時任務調度的解決方案,對於我而言很早之前主要是使用Window計劃和Window服務來作任務定時執行,而後就開始使用定時任務調度框架Quartz.Net。可是卻一直沒有上手過Hangfire這個自帶後臺任務調度面板,能夠在後臺手動執行任務的神奇的任務調度框架。前段時間終於開始對他下手了,經過在網上查閱了一些資料和查看了Hangfire在Github中的demo,終於在我本身的項目中用上了Hangfire。在該篇文章中主要簡單介紹一下什麼是Hangfire,Hangfire的基本特徵與優勢和分別使用MySQL,MS SQL Server做爲存儲使用。html
Hangfire是一個開源的.NET任務調度框架,提供了內置集成化的控制檯,能夠直觀明瞭的查看做業調度狀況,而且Hangfire不須要依賴於單獨的應用程序執行(如:windows服務,window計劃)。而且支持持久性存儲。mysql
Hangfire與特定的.NET應用程序類型無關。您能夠在ASP.NET Web應用程序,非ASP.NET Web應用程序,控制檯應用程序或Windows服務中使用它。如下是要求:git
1.NET Framework 4.5github
2.永久存儲(Hangfire將後臺做業和其餘與處理有關的信息保留在永久性存儲器中,因此須要存儲庫來存儲如:MS SQL Server,Redis,MySQL,PostgreSql等)web
3.Newtonsoft.Json庫≥5.0.1sql
經過官網中的一張圖片即可知道它是一個多麼優秀的任務調度框架,以下圖所示:數據庫
詳情地址: https://www.nuget.org/packages?q=Hangfirewindows
在ASP.NET 應用程序下使用Hangfire安裝: app
Install-Package Hangfire
在控制檯應用程序或者window server中處理做業:框架
Install-Package Hangfire.Core Install-Package Hangfire.SqlServer
注意,在控制檯應用程序或者window server中不推薦直接安裝:Install-Package Hangfire ,由於它只是一個快速啓動軟件包,幷包含您可能不須要的依賴項(例如,Microsoft.Owin.Host.SystemWeb等無關依賴項)。
在ASP.NET 應用程序下使用Hangfire安裝:
Install-Package Hangfire.Core
咱們還須要安裝一個MySql存儲(Hangfire.MySqlStorage)的拓展,注意由於Hangfire自己是不支持MySQL存儲的,這是名爲:Arnoldas Gudas做者拓展的:
Nuget地址:https://www.nuget.org/packages/Hangfire.MySqlStorage/
安裝命令:
注意:由於個人項目是.NET Framework,Version=v4.5.1版本的,因此只能安裝1.0.7版本的,你們看需求而定
Install-Package Hangfire.MySqlStorage -Version 1.0.7
當咱們要使用(宿主)IIS託管ASP.NET應用程序時,咱們還須要安裝:
Install-Package Microsoft.Owin.Host.SystemWeb -Version 4.0.1
這裏是當你的項目中不存在Startup.cs時才須要執行添加的操做!
簡單概述:是.NET 平臺開放的web接口,Startup則是.Net與web通信管道,起到轉發,溝通的做用。
詳情介紹:http://www.javashuo.com/article/p-uyrrlmzs-ch.html
public void Configuration(IAppBuilder app) { //運用SqlServer存儲,對應web.config中的connectionStrings中的name GlobalConfiguration.Configuration.UseSqlServerStorage("sqlserver_connection");
//注意,當你使用的是MySql做爲存儲時,須要以下配置 //運用MySql存儲,對應web.config中的connectionStrings中的name GlobalConfiguration.Configuration.UseStorage(new MySqlStorage("mysql_connection")); app.UseHangfireDashboard();//配置後臺儀表盤 app.UseHangfireServer();//開始使用Hangfire服務 }
1.MS SQL Server中:
<connectionStrings> <add name="sqlserver_connection" connectionString="Data Source=.;Initial Catalog=MyFirstDb;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
2.MySQL中:
<connectionStrings> <add name="mysql_connection" providerName="System.Data.MySqlClient" connectionString="Server=123.xxx.xxx.xx;Port=3306;Database=MyFirstDb;Uid=root;Pwd=youpassword;charset=utf8;SslMode=none;Allow User Variables=True" /> </connectionStrings>
當咱們已經完成了上面的相關配置後,且程序可以正常無bug的運行時,咱們的Hangfire Dashboard(儀表盤)在咱們的本地就能夠正常訪問了(Hangfire儀表盤默認只支持本地訪問),假如須要遠程可訪問的話咱們還須要作對應的配置受權操做!
首次運行成功後,打開數據庫能夠看到Hangfire已經自動爲咱們建立了定時任務的一些定時任務列表,定時隊列,服務,狀態等相關的數據表(展示了Hangfire做用的持久化特性),以下圖所示:
a.MS SQL Server中生成的表:
b.MySQL中生成的表:
本地訪問方式:https://localhost:端口號/hangfire/
調度控制面板效果圖:
注意:WriteLog是本身封裝的一個通用記錄日誌的方法!
//支持基於隊列的任務處理:任務執行不是同步的,而是放到一個持久化隊列中,以便立刻把請求控制權返回給調用者。 var jobId = BackgroundJob.Enqueue(()=>WriteLog("隊列任務執行了!")); //延遲任務執行:不是立刻調用方法,而是設定一個將來時間點再來執行,延遲做業僅執行一次 var jobId = BackgroundJob.Schedule(()=>WriteLog("一天後的延遲任務執行了!"),TimeSpan .FromDays(1));//一天後執行該任務 //循環任務執行:一行代碼添加劇復執行的任務,其內置了常見的時間循環模式,也可基於CRON表達式來設定複雜的模式。【用的比較的多】 RecurringJob.AddOrUpdate(()=>WriteLog("每分鐘執行任務!"), Cron.Minutely); //注意最小單位是分鐘 //延續性任務執行:相似於.NET中的Task,能夠在第一個任務執行完以後緊接着再次執行另外的任務 BackgroundJob.ContinueWith(jobId,()=>WriteLog("連續任務!"));
經過本次項目實踐的確讓我感覺到了Hangfire的魅力所在,真的能夠說是上手簡單,開箱即用的一個任務調度框架。而且該框架作的最好的是,官方文檔詳細,而且還提供了完整的demo示例。最後要爲Hangfire的做者點贊!
GitHub源碼:https://github.com/HangfireIO/Hangfire
中文文檔:https://www.bookstack.cn/read/Hangfire-zh-official/README.md
GitHub使用示例源碼:https://github.com/HangfireIO/Hangfire.Samples(包括控制檯應用程序,window服務,ASP.NET MVC,WebForm)
Hangfire使用文章彙總:https://www.bbsmax.com/R/xl56E0nrJr/