前言

在平时项目开发中,定时任务调度是一项重要的功能,广泛应用于后台作业、计划任务和自动化脚本等模块。

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技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

.NET 轻量化定时任务调度 FreeScheduler的更多相关文章

  1. MDC轻量化日志链路跟踪的若干种应用场景

    "If debugging is the process of removing software bugs, then programming must be the process of ...

  2. 基于Spring Task的定时任务调度器实现

    在很多时候,我们会需要执行一些定时任务 ,Spring团队提供了Spring Task模块对定时任务的调度提供了支持,基于注解式的任务使用也非常方便. 只要跟需要定时执行的方法加上类似 @Schedu ...

  3. C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET还是Hangfire?

    原文由Rector首发于 码友网 之 <C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件有哪些,Timer,FluentScheduler,TaskSchedule ...

  4. C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是...

    原文:C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是... 原文由Rector首发于 码友网 之 <C#/.NET/.NET ...

  5. #研发中间件介绍#定时任务调度与管理JobCenter

    郑昀 最后更新于2014/11/11 关键词:定时任务.调度.监控报警.Job.crontab.Java 本文档适用人员:研发员工   没有JobCenter时我们要面对的:   电商业务链条很长,业 ...

  6. 轻量化ViewControllers,读文章做的总结

    推荐一个网站 http://objccn.io/ 我这两天才开始看 获益匪浅 看了第一篇文章 <更轻量的View Controllers>感觉写的不错 感觉作者 原文地址 http://o ...

  7. Java定时任务调度详解

    前言 在实际项目开发中,除了Web应用.SOA服务外,还有一类不可缺少的,那就是定时任务调度.定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券 ...

  8. Spring4.0.1+Quartz2.2.1实现定时任务调度[亲测可用]

    Spring4.0.1+Quartz2.2.1实现定时任务调度[亲测可用] tip:只需要配置xml文件即可 1.第三方依赖包的引入 <properties> <project.bu ...

  9. SpringQuartz 实现定时任务调度

    最近公司新项目需要用到定时器,于是研究了一下发现: Spring中使用Quartz有两种方式实现: 第一种是任务类继承QuartzJobBean 第二种则是在配置文件里定义任务类和要执行的方法,类和方 ...

  10. 开源一个定时任务调度器 webscheduler

    在企业应用中定时任务调度的需求是必不可少的,比如定时同步数据,定时结转数据,定时检测异常等等.公司之前是在使用一款采用.net 开发的windows服务形式的定时程序,基本能满足需求,在一段时间的时候 ...

随机推荐

  1. 在System身份运行的.NET程序中以指定的用户身份启动可交互式进程

    今天在技术群里,石头哥向大家提了个问题:"如何在一个以System身份运行的.NET程序(Windows Services)中,以其它活动的用户身份启动可交互式进程(桌面应用程序.控制台程序 ...

  2. Java开发者的神经网络进阶指南:深入探讨交叉熵损失函数

    前言 今天来讲一下损失函数--交叉熵函数,什么是损失函数呢?大体就是真实与预测之间的差异,这个交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异 ...

  3. 基于防火墙的SSLVPN

    SCVPN即SSLVPN 拓补图 记得打开策略! 设置外接口(一些管理方式要打开) 设置SSL 地址池(如没要求设iP,随意设) 建立SSL VPN 出接口,地址池要选对 创建一个本地用户(账号A 密 ...

  4. EC热键问题

    EC热键问题 ec 问题描述 ACPI事件监控 按键监控 UDEV事件监控 kprobe探测 初步总结热键功能流程 调试记录 PS2 问题描述 系统无触摸板打开和关闭的提示 已知热键功能 快捷键 功能 ...

  5. TI AM62x工业开发板规格书(单/双/四核ARM Cortex-A53 + 单核ARM Cortex-M4F,主频1.4GHz)

    1 评估板简介 创龙科技TL62x-EVM是一款基于TI Sitara系列AM62x单/双/四核ARM Cortex-A53 + 单核ARM Cortex-M4F多核处理器设计的高性能低功耗工业评估板 ...

  6. UG 2406 python 二次开发环境配置

    UG 2406 python 二次开发环境配置 项目地址 https://gitee.com/unm001/nx2406.git 安装python 安装 python 3.10.11 D:\prog\ ...

  7. CF1093E 题解

    来一发 \(O(n \sqrt n)\) 时间,\(O(n)\) 空间的分块写法. 首先建模,把 数值 \(x\) 在两个数组中出现的位置作为坐标,问题就转化为一个二维动态数点. 考虑用序列分块维护第 ...

  8. 微服务网关Gateway使用

    为什么需要网关? Gateway网关是我们服务的守门神,所有微服务的统一入口. 网关的核心功能特性 请求路由和负载均衡 一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转 ...

  9. Mysql 分表分库的策略

    为什么要分表? 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了. 分表的目的就在于此,减小数据库的负担,缩短查询时间. 日常开发中我们经常会遇到大表的情况 ...

  10. SpringBoot 整合EasyExcel 获取动态Excel列名

    导读 最近负责消息网关,里面有个短信模板导入功能,因为不同模板编号对应不同参数,导入后的数据定时发送,涉及到Excel中列名不固定问题,于是想根据列名+值,组合成一个大JSON,具体代码如下. 引入依 ...