前言 在平時項目開發中,定時任務調度是一項重要的功能,廣泛應用於後臺作業、計劃任務和自動化腳本等模塊。 FreeScheduler 是一款輕量級且功能強大的定時任務調度庫,它支持臨時的延時任務和重覆迴圈任務(可持久化),能夠按秒、每天/每周/每月固定時間或自定義間隔執行(CRON 表達式)。 此外 ...
前言
在平時項目開發中,定時任務調度是一項重要的功能,廣泛應用於後臺作業、計劃任務和自動化腳本等模塊。
FreeScheduler 是一款輕量級且功能強大的定時任務調度庫,它支持臨時的延時任務和重覆迴圈任務(可持久化),能夠按秒、每天/每周/每月固定時間或自定義間隔執行(CRON 表達式)。
此外 FreeScheduler 還支持 .NET Framework 4.0、.NET Core 2.1+ 以及 Xamarin、MAUI 等平臺。
本文將介紹 FreeScheduler 的基本功能和使用方法,能夠立即上手使用,幫助我們快速 輕鬆的管理和調度定時任務,無論是用於個人項目還是企業級應用都是一個不錯的選擇,快來試試吧。
項目介紹
FreeScheduler 是一款基於 IdleBus 實現的輕量化定時任務調度庫,支持集群部署、臨時的延時任務和重覆迴圈任務(可持久化)。
它可以按秒、每天/每周/每月固定時間或自定義間隔執行任務,並相容 .NET Core 2.1+ 和 .NET Framework 4.0+ 運行環境。
- 輕量化解釋
- 特色功能之一
- 特色功能之二
FreeScheduler 支持一個任務設置 [5,5,30,30,60] 不同的定時間隔,任何一次成功都可結束整個任務。
項目使用
1、安裝相關Nuget包
dotnet add package FreeScheduler
或者
Install-Package FreeScheduler
2、對應 Program.cs
using FreeScheduler; Scheduler scheduler = new FreeSchedulerBuilder() .OnExecuting(task => { Console.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.fff")}] {task.Topic} 被執行"); task.Remark("log.."); }) .Build(); if (Datafeed.GetPage(scheduler, null, null, null, null).Total == 0) { scheduler.AddTask("[系統預留]清理任務數據", "86400", -1, 3600); scheduler.AddTaskRunOnWeek("(周一)武林大會", "json", -1, "1:12:00:00"); scheduler.AddTaskRunOnWeek("(周日)親子活動", "json", -1, "0:00:00:00"); scheduler.AddTaskRunOnWeek("(周六)社交活動", "json", -1, "6:00:00:00"); scheduler.AddTaskRunOnMonth("月尾最後一天", "json", -1, "-1:16:00:00"); scheduler.AddTaskRunOnMonth("月初第一天", "json", -1, "1:00:00:00"); scheduler.AddTask("定時20秒", "json", 10, 20); scheduler.AddTask("測試任務1", "json", new[] { 10, 30, 60, 100, 150, 200 }); } var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddSingleton(scheduler); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseFreeSchedulerUI("/freescheduler/"); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
方法解釋
打開瀏覽器訪問 http://localhost:5000/freescheduler/ ,就可以看到我們設置的任務。
項目特點
-
支持 單項目,多站點部署
-
支持 多進程,不重覆執行
-
支持 進程退出後,由其他進程重新載入任務(約30秒後)
-
支持 進程互通,任意進程都可以執行(RemoveTask/ExistsTask/PauseTask/RunNowTask/RemoveTempTask/ExistsTempTask)
-
支持 進程意外離線後,卸載進程內的任務,重新安排上線
1、臨時任務(不可持久化)
void Callback() { Console.WriteLine("時間到了"); scheduler.AddTempTask(TimeSpan.FromSeconds(10), Callback); //下一次定時 } scheduler.AddTempTask(TimeSpan.FromSeconds(10), Callback);
方法解釋
2、迴圈任務/可持久化
//每5秒觸發,執行N次 var id = scheduler.AddTask("topic1", "body1", round: -1, 5); //每次 不同的間隔秒數觸發,執行6次 var id = scheduler.AddTask("topic1", "body1", new [] { 5, 5, 10, 10, 60, 60 }); //每天 20:00:00 觸發,執行N次(註意設置時區 UseTimeZone) var id = scheduler.AddTaskRunOnDay("topic1", "body1", round: -1, "20:00:00"); //每周一 20:00:00 觸發,執行1次 var id = scheduler.AddTaskRunOnWeek("topic1", "body1", round: 1, "1:20:00:00"); //每月1日 20:00:00 觸發,執行12次 var id = scheduler.AddTaskRunOnMonth("topic1", "body1", round: 12, "1:20:00:00"); //每月最後一日 20:00:00 觸發,執行12次 var id = scheduler.AddTaskRunOnMonth("topic1", "body1", round: 12, "-1:20:00:00"); //自定義間隔 cron var id = scheduler.AddTaskCustom("topic1", "body1", "0/1 * * * * ? "); new FreeSchedulerBuilder() ... .UseCustomInterval(task => { //利用 cron 功能庫解析 task.IntervalArgument 得到下一次執行時間 //與當前時間相減,得到 TimeSpan,若返回 null 則任務完成 return TimeSpan.FromSeconds(5); }) .Build();
方法說明
3、預留任務
[系統預留]清理任務數據
//每小時觸發,定期清理24小時之前的數據(單位:秒) scheduler.AddTask("[系統預留]清理任務數據", "86400", round: -1, 3600);
4、管理任務
// 使用 FreeSql 或者 SQL 查詢 TaskInfo、TaskLog 兩個表進行分頁顯示 fsql.Select<TaskInfo>().Count(out var total).Page(pageNumber, 30).ToList(); fsql.Select<TaskLog>().Count(out var total).Page(pageNumber, 30).ToList(); //暫停任務 scheduler.PauseTask(id); //恢復暫停的任務 scheduler.ResumeTask(id); //刪除任務 scheduler.RemoveTask(id); //立刻運行任務(人工觸發) scheduler.RunNowTask(id);
性能參考
FluentScheduler 單個 Registry 測試正常,但目測單線程執行(間隔1-10ms),處理速度不理想
嘗試把 FreeScheduler 內核改成 HashedWheelTimer 記憶體占用更高(600兆),
結論 FreeScheduler 功能需要占用更多資源
項目地址
Gitee:https://gitee.com/hubo/FreeScheduler
Github:https://github.com/2881099/FreeScheduler
文檔:https://freesql.net/guide/freescheduler.html
最後
如果你覺得這篇文章對你有幫助,不妨點個贊支持一下!你的支持是我繼續分享知識的動力。如果有任何疑問或需要進一步的幫助,歡迎隨時留言。也可以加入微信公眾號 [DotNet技術匠] 社區,與其他熱愛技術的同行一起交流心得,共同成長!