公司动态
Gofer.NET周期任务终极指南:6段Crontab+间隔计时打造.NET永不掉线的Cron Job
Gofer.NET周期任务终极指南6段Crontab间隔计时打造.NET永不掉线的Cron Job【免费下载链接】Gofer.NETEasy C# API for Distributed Background Tasks/Jobs for .NET Core.项目地址: https://gitcode.com/gh_mirrors/go/Gofer.NETGofer.NET 是一个面向 .NET Core 的简单 C# API用于构建分布式后台任务。它的RecurringTask周期任务功能让你只需一行代码就能在 Redis 上创建持久化定时任务支持6段 Crontab 表达式和TimeSpan 间隔计时两种调度方式。本指南带你完整掌握周期任务的创建、更新与取消告别服务一重启、定时任务就掉线的烦恼。什么是 Gofer.NET 周期任务Gofer.NET 是一款受 Python Celery 启发的分布式任务队列为 .NET Core 提供三种任务类型即发即忘任务入队后立即由空闲 worker 执行⏰定时任务在指定时间只运行一次周期任务RecurringTask按间隔或 Crontab 规则循环执行即本文主角周期任务的定义持久化在 Redis 中worker 池可以随时水平扩容。即使某个 worker 重启周期任务依然存活由任意在线 worker 继续调度——这正是Cron Job 永不掉线的关键。 相关源码导航周期任务定义RecurringTask.cs调度入口TaskScheduler.csAddRecurringTask/CancelRecurringTask官方文档jobs.md两种调度方式TimeSpan 间隔 与 6段 CrontabAddRecurringTask提供两个重载分别对应两种调度方式。两种方式都需要传入一个唯一的taskName任务名后续更新、取消都靠它var taskClient new TaskClient(TaskQueue.Redis(127.0.0.1:6379)); // 方式一间隔计时每 5 分钟运行一次 await taskClient.TaskScheduler.AddRecurringTask(() WriteDate(), TimeSpan.FromMinutes(5), five-minute-timespan); // 方式二6段 Crontab每 7 分钟运行一次 await taskClient.TaskScheduler.AddRecurringTask(() WriteDate(), 0 */7 * * * *, seven-minute-crontab);方式一TimeSpan 间隔计时间隔基于任务创建时间StartTime起算、按整段间隔循环。例如间隔 10 秒任务会在第 10 秒、20 秒、30 秒……依次运行。下次运行时间的计算逻辑见 RecurringTask.cs 的GetNextRunTime方法。适合每 N 分钟/小时跑一次这类简单场景写法零门槛。方式二6段 Crontab含秒Gofer.NET 使用 NCrontab 解析 Crontab 表达式注意它是6 段比传统 5 段系统 Crontab 多一个秒位排在最前段位含义示例第1段秒0第2段分钟*/7每7分钟第3段小时99点第4段日*每天第5段月*第6段星期*常用表达式速查表达式含义* * * * * *每秒运行0 */7 * * * *每 7 分钟运行0 0 9 * * *每天 09:00:00 运行0 0 */6 * * *每 6 小时整点运行 创建任务时系统会先校验表达式ValidateCrontab写错的 Crontab 会立即抛错不会悄悄生成一个永远不执行的任务。更新周期任务同名重写即可这是 Gofer.NET 周期任务最省心的设计重复调用AddRecurringTask并使用相同的 taskName旧任务会被自动覆盖。无需先删除再创建改执行间隔换个TimeSpan传入即可换执行函数与参数换掉 lambda 表达式即可甚至能在间隔模式和Crontab 模式之间切换底层机制系统先用IsEquivalent比较函数、间隔、Crontab 三者是否一致见 RecurringTask.cs完全相同则不做任何操作有变化才更新到 Redis。这让每次部署时重新声明任务成为一种安全的自愈方式。取消周期任务三种方法任选方法用法适用场景CancelRecurringTask(recurringTask)传入创建时返回的对象创建后马上取消CancelRecurringTask(task-name)传入任务名字符串只有任务名时CancelTask(recurringTask.TaskKey)传入 TaskKey也可用于取消定时任务⚠️ 特别注意taskName你自定义的任务名和TaskKey系统生成的内部标识不是一回事CancelTask需要的是后者。Worker 宕机时会发生什么很多人担心 worker 挂掉一段时间后错过的周期会不会积压恢复后一次性补跑大量任务。Gofer.NET 的设计更简单直接错过的间隔会被跳过worker 恢复后只按下一个正常时间点运行不会补跑历史周期避免任务堆积和重复执行。同时注意两点前提至少要有一个 worker 在运行周期任务才会被调度worker 的系统时间应准确避免意外提前/延后执行实战小贴士✅ 任务函数建议写成static参数保持简单字符串、整数最佳✅ 让任务幂等即使意外执行多次结果也应当和一次相同✅ worker 进程长期运行Listen()配合 Docker/systemd 的自动重启策略周期任务即可 7×24 不掉线想动手跑一遍完整流程可以查看示例工程主程序创建周期任务example/primary/Program.csworker 程序监听执行example/worker/Program.cs快速总结能力说明调度方式TimeSpan间隔计时 / 6 段 Crontab含秒位更新任务同名重复调用AddRecurringTask即覆盖取消任务对象 / 任务名 / TaskKey 三种方式宕机行为跳过错过间隔不补跑、不积压持久化任务定义存于 Redis与单机解耦掌握以上内容你就可以用 Gofer.NET 轻松构建一个简单、可靠、永不掉线的 .NET Cron Job 了。【免费下载链接】Gofer.NETEasy C# API for Distributed Background Tasks/Jobs for .NET Core.项目地址: https://gitcode.com/gh_mirrors/go/Gofer.NET创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考