.NET Core/.NET5/.NET6 開源項目匯總2:任務調度組件
- 2021 年 6 月 21 日
- 筆記
- .NET:.NET Core, .NET:.NET5, .NET:.NET6, .NET:開源項目
開源項目是眾多組織與個人分享的組件或項目,作者付出的心血我們是無法體會的,所以首先大家要心存感激、尊重。請嚴格遵守每個項目的開源協議後再使用。尊重知識產權,共建和諧開源社區。
以下開源項目(含組件),從網路搜集,後期會不斷補充。
FluentSchedule 是.NET平台下的一款輕量級任務調度組件。介面豐富,功能強大,簡單易容。官網提供的豐富示例,讓開發者很容易上手。如果在項目中簡單的設置定時任務,優先使用該組件。
官網://fluentscheduler.github.io/
GitHub://github.com/fluentscheduler/FluentScheduler

ScheduleMaster是一個開源的分散式任務調度系統,它基於.NET Core 3.1平台構建,支援跨平台多節點部署運行。
主要特性:
-
簡易的Web UI操作;
-
任務動態管理:創建、啟動、停止、暫停、恢復、刪除等;
-
高可用支援,跨平台多節點部署。
-
數據安全性,不會出現多實例並發調度。
-
支援自定義參數設置;
-
支援 .NET Core 和 .NET Framework(4.6.1+);
-
支援自定義配置文件和熱更新;
-
支援設置監護人,運行異常時郵件告警;
-
支援設置任務依賴,自動觸發,共享任務結果;
-
插件式開發,任務運行環境隔離;
-
全鏈路日誌系統,運行軌跡輕鬆掌控;
-
用戶訪問控制;
-
提供開放REST API,業務系統可以無縫集成;
-
調度報表統計;
-
任務分組管理;
-
計劃表拆分實現復用;
-
指定節點運行;
-
支援http任務配置;
-
支援延時任務;
-
任務監控;
-
資源監控;
-
支援異常策略配置(失敗重試、超時控制等);
-
接入redis快取;
-
多資料庫類型支援;
-
用戶許可權更加精細化;
-
報表統計完善;
技術棧:
ASP.NET Core3.1、EntityFramework Core3.0、Mysql5.7、Quartz.Net、BeyondAdmin、Jquery…
Gitee://gitee.com/hey-hoho/ScheduleMasterCore

.NET Framework 通過 System.Timers.timer 類具有「內置」計時器功能。為什麼有人會使用Quartz而不是這些標準功能?
原因包括以下幾個方面:
- 計時器沒有持久性機制。
- 計時器的調度不靈活(只能設置開始時間和重複間隔,不能基於日期、時間等進行設置)。
- 計時器不使用執行緒池(每個計時器一個執行緒)。
- 計時器沒有真正的管理方案——你必須編寫自己的機制,以便能夠記住、組織和按名稱檢索任務等。
對於一些簡單的應用程式,這些功能可能並不重要,在這種情況下,不使用Quartz.NET可能是正確的決定。
官網://www.quartz-scheduler.net/
GitHub://github.com/quartznet/quartznet
Hangfire是一個開源框架,它幫助您創建、處理和管理後台作業。
功能特徵:
- 支援基於隊列的任務處理。任務執行不是同步的,而是放到一個持久化隊列中,以便馬上把請求控制權返回給調用者。使用方法:
BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
- 延遲任務(方法)執行。可以將方法的執行推遲一段指定的時間,而不是立即調用方法:
BackgroundJob.Schedule(() => Console.WriteLine("Hello, world!"), TimeSpan.FromMinutes(5));
- 循環執行任務。只需簡單的一行程式碼就可以添加重複執行的任務,其內置了常見的時間循環模式,也可以基於CRON表達式來設定複雜的模式。使用方法:
RecurringJob.AddOrUpdate(() => Console.Write("Easy!"), Cron.Daily);
RecurringJob.AddOrUpdate(() => Console.Write("Powerful!"), "0 12 * */2");
- SQL Server 與 Redis 持久化支援。Hangfire使用持久性存儲來存儲作業、隊列和統計資訊,並讓它們在應用程式重啟後繼續存在。存儲子系統的抽象程度足以支援經典的SQL Server和快速的Redis。
- SQLServer提供了簡化的安裝和常規的維護計劃。
- Redis提供了驚人的速度,尤其是與sqlserver相比,但需要更多的知識。
- 自動重試機制。如果你的方法遇到了一個暫時的異常,不用擔心——它會在幾秒鐘內自動重試。如果所有重試嘗試都已用盡,則可以從集成的web介面手動重新啟動。還可以使用AutomaticRetryAttribute類控制重試行為。只需將其應用於您的方法,告訴Hangfire重試次數:
[AutomaticRetry(Attempts = 100)] public static void GenerateStatistics() { } BackgroundJob.Enqueue(() => GenerateStatistics());
- 保證執行任務。Hangfire是在知道託管環境可以殺死每行上的所有執行緒的情況下製作的。因此,它在成功完成之前不會刪除作業,並且包含不同的隱式重試邏輯以在其處理中止時執行該作業。
- 實例方法調用。Hangfire除了支援靜態方法調用,還支援調用實例方法。當worker看到給定的方法是實例方法時,它將首先激活它的類。默認情況下,使用Activator.CreateInstance方法,因此默認情況下僅支援具有默認構造函數的類。但是您可以插入IoC容器並通過構造函數傳遞依賴項。
public class EmailService { public void Send() { } } BackgroundJob.Enqueue<EmailService>(x => x.Send());
- 文化捕捉。當您將方法調用編組到另一個執行上下文中時,您應該能夠保留一些環境設置。他們中有些人-Thread.CurrentCulture以及Thread.CurrentUICulture將自動為您拍攝。PreserveCultureAttribute默認情況下,它由應用於所有方法的類完成。
- 支援任務取消。Hangfire可以告訴方法由於shutdown事件而被中止或取消,因此可以使用類似於常規CancellationToken類的作業取消令牌來優雅地停止它們。
public void Method(IJobCancellationToken token) { for (var i = 0; i < Int32.MaxValue; i++) { token.ThrowIfCancellationRequested(); Thread.Sleep(1000); } }
- 支援IOC容器。目前支援Ninject和Autofac。
- 支援日誌記錄。Hangfire使用Common.Logging庫來記錄其所有事件。
- 友好的Web支援。可以在相同或不同的機器上運行多個 Hangfire 實例。它使用分散式鎖定來防止競爭條件。每個 Hangfire 實例都是冗餘的,可以無縫添加或刪除實例(但要控制它們偵聽的隊列)。
- 支援多隊列處理。同一個Hangfire實例可以支援多個隊列,以便更好的控制任務的執行方式。
- 並發級別的控制。Hangfire使用自己的固定工作執行緒池來消耗排隊的作業。默認工作進程計數設置為 Environment.ProcessorCount*5,即CPU數量的5倍。此數字針對CPU密集型和I/O密集型任務進行了優化。如果遇到過多的等待或上下文切換,可以手動配置工作進程的數量:
app.UseHangfire(config => { config.UseServer(100); }); // or var server = new BackgroundJobServer(100);
- 多環境處理任務。默認情況下,作業處理是在 ASP.NET 應用程式中進行的。但是您可以在控制台應用程式、Windows 服務或其他任何地方處理作業。
- 可擴展性。Hangfire 旨在儘可能通用。您可以擴展以下部分:
- 存儲實現
- 狀態子系統(包括創建新狀態)
- 創造就業的過程
- 工作績效流程
- 狀態變化過程
- 工作激活過程
一些核心組件作為擴展:QueueAttribute、PreserveCultureAttribute、AutomaticRetryAttribute、SqlServerStorage、RedisStorage、NinjectJobActivator、AutofacJobActivator、ScheduledState。
MVP 2015社區大講堂之:在ASP.NET應用中執行後台任務。
PPT://pan.baidu.com/s/1eQpKURK
參考文獻:
- //www.cnblogs.com/redmoon/p/4394962.html