前言
在平时项目开发中,定时使命调度是一项重要的功能,广泛应用于后台作业、计划使命和主动化脚本等模块。
FreeScheduler 是一款轻量级且功能强大的定时使命调度库,它支持暂时的延时使命和重复循环使命(可持久化),能够按秒、每天/每周/每月固定时间或自定义间隔执行(CRON 表达式)。
别的 FreeScheduler 还支持 .NET Framework 4.0、.NET Core 2.1+ 以及 Xamarin、MAUI 等平台。
本文将介绍 FreeScheduler 的基本功能和使用方法,能够立即上手使用,资助我们快速 轻松的管理和调度定时使命,无论是用于个人项目还是企业级应用都是一个不错的选择,快来试试吧。
项目介绍
FreeScheduler 是一款基于 IdleBus 实现的轻量化定时使命调度库,支持集群部署、暂时的延时使命和重复循环使命(可持久化)。
它可以按秒、每天/每周/每月固定时间或自定义间隔执行使命,并兼容 .NET Core 2.1+ 和 .NET Framework 4.0+ 运行环境。
了解 FreeRedis、FreeSql、csredis 的人都知道,我们发布的开源项目是绿色著称,零依赖发布后只有一个DLL,不会造成使用者项目依赖辩论,支持 .NET 4.0 堪称屎山项目的救星。现在另有很多.NET FX 4.0 的项目,这些项目因汗青遗留原因或硬件限制,不能更换 .NET Core 版本。因此这些项目很难使用到现有的开源库,不能使用可靠的开源库,那么很多时候都要自行实现,在堆积代码的同时,项目也有可能越来越乱,代码越来越渣,项目逐渐变得不稳定。
持久化,比如创建订单半小时未支付,给用户催发短信,这种动态使命会用到技久化。
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技能匠] 社区,与其他热爱技能的偕行一起交流心得,共同成长!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |