首页 > 其他分享 >.NET 轻量化定时任务调度 FreeScheduler

.NET 轻量化定时任务调度 FreeScheduler

时间:2024-08-16 10:51:19浏览次数:10  
标签:00 任务 FreeScheduler scheduler var NET 任务调度 id

前言

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

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

标签:00,任务,FreeScheduler,scheduler,var,NET,任务调度,id
From: https://www.cnblogs.com/1312mn/p/18356212

相关文章

  • Kubernetes中Pod间通信的详细解析
    目录同一个节点中Pod通信原理网络拓扑结构通信过程不同节点上的Pod通信原理网络拓扑结构通信过程同一个节点中Pod通信原理网络拓扑结构Pod:每个Pod都有一个唯一的IP地址(例如,172.16.3.2和172.16.3.3)。Pod内部的网络接口(eth0)连接到一个虚拟网络设备(veth)。虚拟网络设备(vethp......
  • .NET辅助角色服务入门简介
    在日常开发中,并不是所有的功能都是用户可见的,还在一些背后默默支持的程序,这些程序通常以服务的形式出现,统称为辅助角色服务。今天以一个简单的小例子,简述基于.NET开发辅助角色服务的相关内容,仅供学习分享使用,如有不足之处,还请指正。 概述 根据项目需求不同,创建长时间运行的......
  • 亮相2024 DPU&AI Networking创新大会,天翼云斩获两项大奖!
    近日,以“智驱网络芯动未来”为主题的2024DPU&AINetworking创新大会在北京举办。大会表彰了在DPU与AI网络技术创新及实践应用中取得卓越成就的单位与项目,天翼云科技有限公司荣膺创新引擎奖、《紫金DPU算力卸载与网络加速应用》荣获实践先锋奖,技术创新实力以及应用实践成果再获行......
  • c# net爬取百度热搜
    varurl="https://top.baidu.com/board?tab=realtime";//百度using(varhttpClient=newHttpClient()){varresponse=awaithttpClient.GetStringAsync(url);varhtmlDocument=newHtmlDocument();htmlDocument.LoadHtml(response);varcategoryWrapN......
  • TeeChart.NET 4.2024.7.29 Crack
    Versatilenative.NETCharting,MapandGaugecontrolTheTeeChartNETProEditionisaNugetbasedChartingcontroldesignedtoofferinstantchart,mapandgaugecapabilitiestoyourNETapplication.Withdozensofcharttypes,statisticalfunctionsand......
  • 吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)1.5-1.
    目录第四门课卷积神经网络(ConvolutionalNeuralNetworks)第一周卷积神经网络(FoundationsofConvolutionalNeuralNetworks)1.5卷积步长(Stridedconvolutions)1.6三维卷积(Convolutionsovervolumes)第四门课卷积神经网络(ConvolutionalNeuralNetworks)第一周......
  • 0233-Net-linux 收包流程
    环境Time2022-11-27WSL-Ubuntu22.04前言说明参考:https://github.com/leandromoreira/linux-network-performance-parameters目标了解linux系统接收网络数据包的具体流程。数据到达网卡网卡将光电信号还原成数据包。网卡校验如果不是在混杂模式下,网卡校验数据包中......
  • Kubernetes的网络基础
    kubernetes网络模型Kubernetes集群上会存在三个分别用于节点、Pod和Service的网络于worker上完成交汇由节点内核中的路由模块,以及iptables/netfilter和ipvs等完成网络间的流量转发Kubernetes网络模型(2)节点网络集群节点间的通信网络,并负责打通与集群外部端点间的通信......
  • kubernetes高效学习
    知识结构1.基础概念与概述k8s简介:了解k8s的起源、目标、应用场景和优势。核心概念:Pod、Node、Service、Label、Namespace、Deployment等。2.集群架构Master节点:APIServer、Scheduler、Controller-Manager、Etcd。Node节点:Kubelet、Kube-proxy、Docker(或其他容器运行......
  • .NET 7 + Vue 权限管理系统 小白快速上手
    前言今天给大家推荐一个超实用的开源项目《.NET7+Vue权限管理系统小白快速上手》,DncZeus的愿景就是做一个.NET领域小白也能上手的简易、通用的后台权限管理模板系统基础框架。不管你是技术小白还是技术大佬或者是不懂前端Vue的新手,这个项目可以快速上手让我们从0到1,搭建......