Sundial
.NET 功能齐全的开源分布式作业调度系统,可从最小的应用程序到大型企业系统使用。
特性
- 简化调度作业
- 支持作业监视器
- 支持作业执行器
- 支持自定义作业存储组件(持久化)
- 支持自定义策略执行
- 内置周期、Cron 作业
- 支持自定义作业触发器
- 支持依赖注入控制(含 HTTP 控制支持)
- 高内聚,低耦合,使代码更简单
- 很小,仅
41KB
- 无第三方依赖,TimeCrontab 也是本人作品
- 可在
Windows/Linux/MacOS
守护进程部署 - 支持分布式、集群(多实例)部署
- 支持负载均衡(基于 TCP/IP)
- 高质量代码和良好单元测试
- 跨平台,支持 .NET5+
安装
Install-Package Sundial
dotnet add package Sundial
快速入门
我们在主页上有不少例子,这是让您入门的第一个:
- 定义作业,并实现
IJob
接口:
public class MyJob : IJob
{
private readonly ILogger<MyJob> _logger;
public MyJob(ILogger<MyJob> logger)
{
_logger = logger;
}
{
private readonly ILogger<MyJob> _logger;
public MyJob(ILogger<MyJob> logger)
{
_logger = logger;
}
public Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
{
_logger.LogInformation($”{context}“);
return Task.CompletedTask;
}
}
- 在
Startup.cs
注册AddSchedule
服务和作业:
services.AddSchedule(options =>
{
options.AddJob<MyJob>(Triggers.PeriodSeconds(5));
});
{
options.AddJob<MyJob>(Triggers.PeriodSeconds(5));
});
- 运行项目:
info: 2022-12-05 19:32:56.3835407 +08:00 星期一 L System.Logging.ScheduleService[0] #1
Schedule hosted service is running.
info: 2022-12-05 19:32:56.3913451 +08:00 星期一 L System.Logging.ScheduleService[0] #1
Schedule hosted service is preloading…
info: 2022-12-05 19:32:56.4322887 +08:00 星期一 L System.Logging.ScheduleService[0] #1
The <job1_trigger1> trigger for scheduler of <job1> successfully appended to the schedule.
info: 2022-12-05 19:32:56.4347959 +08:00 星期一 L System.Logging.ScheduleService[0] #1
The scheduler of <job1> successfully appended to the schedule.
warn: 2022-12-05 19:32:56.4504555 +08:00 星期一 L System.Logging.ScheduleService[0] #1
Schedule hosted service preload completed, and a total of <1> schedulers are appended.
info: 2022-12-05 19:33:01.5100177 +08:00 星期一 L MyJob[0] #13
<job1> [C] <job1 job1_trigger1> 5s 1ts 2022-12-05 19:33:01.395 -> 2022-12-05 19:33:06.428
info: 2022-12-05 19:33:06.4676792 +08:00 星期一 L MyJob[0] #13
<job1> [C] <job1 job1_trigger1> 5s 2ts 2022-12-05 19:33:06.428 -> 2022-12-05 19:33:11.435
info: 2022-12-05 19:33:11.4460946 +08:00 星期一 L MyJob[0] #16
<job1> [C] <job1 job1_trigger1> 5s 3ts 2022-12-05 19:33:11.435 -> 2022-12-05 19:33:16.412
Schedule hosted service is running.
info: 2022-12-05 19:32:56.3913451 +08:00 星期一 L System.Logging.ScheduleService[0] #1
Schedule hosted service is preloading…
info: 2022-12-05 19:32:56.4322887 +08:00 星期一 L System.Logging.ScheduleService[0] #1
The <job1_trigger1> trigger for scheduler of <job1> successfully appended to the schedule.
info: 2022-12-05 19:32:56.4347959 +08:00 星期一 L System.Logging.ScheduleService[0] #1
The scheduler of <job1> successfully appended to the schedule.
warn: 2022-12-05 19:32:56.4504555 +08:00 星期一 L System.Logging.ScheduleService[0] #1
Schedule hosted service preload completed, and a total of <1> schedulers are appended.
info: 2022-12-05 19:33:01.5100177 +08:00 星期一 L MyJob[0] #13
<job1> [C] <job1 job1_trigger1> 5s 1ts 2022-12-05 19:33:01.395 -> 2022-12-05 19:33:06.428
info: 2022-12-05 19:33:06.4676792 +08:00 星期一 L MyJob[0] #13
<job1> [C] <job1 job1_trigger1> 5s 2ts 2022-12-05 19:33:06.428 -> 2022-12-05 19:33:11.435
info: 2022-12-05 19:33:11.4460946 +08:00 星期一 L MyJob[0] #16
<job1> [C] <job1 job1_trigger1> 5s 3ts 2022-12-05 19:33:11.435 -> 2022-12-05 19:33:16.412
JobExecutionContext
重写了 ToString()
方法并提供以下几种格式:
# 持续运行格式
<作业Id> 作业描述 [并行C/串行S] <作业Id 触发器Id> 触发器字符串 触发器描述 触发次数ts 触发时间 -> 下一次触发时间
<作业Id> 作业描述 [并行C/串行S] <作业Id 触发器Id> 触发器字符串 触发器描述 触发次数ts 触发时间 -> 下一次触发时间
# 触发停止格式
<作业Id> 作业描述 [并行C/串行S] <作业Id 触发器Id> 触发器字符串 触发器描述 触发次数ts 触发时间 [触发器终止状态]
文档
您可以在主页找到 Sundial 文档。
贡献
该存储库的主要目的是继续发展 Sundial 核心,使其更快、更易于使用。Sundial 的开发在 Gitee 上公开进行,我们感谢社区贡献错误修复和改进。
许可证
Sundial 采用 MIT 开源许可证。
本期更新
-
新特性
- [新增] 定时任务看板支持自定义刷新频率
SyncRate
功能 4.8.7.43 ⏱️2023.04.12 703b465 - [新增] 定时任务看板支持完全自定义
RequestPath
入口地址功能 4.8.7.34 ⏱️2023.04.04 24736f6 - [新增] 定时任务一系列
.AlterTo
修改作业触发器触发时间便捷方法 4.8.7.31 ⏱️2023.03.31 0349017 - [新增] 定时任务看板
UI
作业列表最近执行时间
列和优化显示效果 4.8.7.12 ⏱️2023.03.15 26462a8 cb5dd17 - [新增] 定时任务作业计划/工厂立即执行
RunJob
方法 4.8.7.11 ⏱️2023.03.15 #I6LD9X - [新增] 定时任务看板
UI
提供立即执行功能 4.8.7.11 ⏱️2023.03.15 #I6LD9X - [新增] 定时任务作业执行上下文
JobExecutionContext
服务提供器ServiceProvider
属性 4.8.7.10 ⏱️2023.03.14 02586f8 - [新增] 定时任务
HTTP
作业,支持定时请求互联网URL
地址 4.8.7.7 ⏱️2023.03.11 01d4466 - [新增] 定时任务作业触发器
Trigger
执行结果Result
和执行耗时ElapsedTime
属性 4.8.7.7 ⏱️2023.03.11 01d4466 - [新增] 定时任务作业看板支持查看作业触发器执行结果
Result
和执行耗时ElapsedTime
属性 4.8.7.7 ⏱️2023.03.11 01d4466 - [新增] 定时任务休眠时长和唤醒时机日志输出 4.8.7.6 ⏱️2023.03.08 #I6LANE
- [新增] 定时任务
IScheduler.[Try]UpdateDetail(builder => {})
和IScheduler.[Try]UpdateTrigger(triggerId, builder => {})
重载方法 4.8.6 ⏱️2023.02.08 6e43a54 - [新增] 定时任务
Dashboard
可自定义入口地址/schedule
4.8.5.6 ⏱️2023.02.02 c5639f5 - [新增] 定时任务执行上下文
RunId
属性,用于标识单次作业触发器执行 4.8.5.1 ⏱️2023.01.30 1aac470 - [新增] 定时任务
Dashboard
查看作业触发器最近运行记录功能 4.8.4.3 ⏱️2023.01.03 e7d24d8 - [新增] 定时任务作业触发器
trigger.GetTimelines()
获取最近10
条运行记录列表 4.8.4.3 ⏱️2023.01.03 e7d24d8 - [新增] 定时任务
Dashboard
看板 4.8.4 ⏱️2022.12.30 d3f9669 - [新增] 定时任务
IScheduler.GetEnumerable()
方法,可将作业计划转换成可枚举字典 4.8.4 ⏱️2022.12.30 4d5235c - [新增] 定时任务配置选项
options.JobDetail.LogEnabled
配置,可自动输出执行日志 4.8.3.7 ⏱️2022.12.14 58d2c20 - [新增] 定时任务
IScheduler
对象每次操作后自动刷新和提供手动刷新Reload()
方法 4.8.3.3 ⏱️2022.12.09 #I65EQ1 - [新增] 定时任务间隔分钟作业触发器
Triggers.PeriodMinutes(5)
和[PeriodMinutes(5)]
特性 4.8.2.8 ⏱️2022.12.01 8e1f06f - [新增] 定时任务工作日作业触发器
Triggers.Workday()
和[Workday]
特性 4.8.2.6 ⏱️2022.11.30 28b2d20 - [新增] 定时任务作业校对功能,可对误差进行校正 4.8.2.6 ⏱️2022.11.30 f725a25
- [新增] 定时任务
Triggers
所有带At
的Cron
表达式触发器构建器及特性 4.8.2.5 ⏱️2022.11.29 #I63PLR - [新增] 定时任务批量添加
SchedulerBuilder
作业功能 4.8.2.4 ⏱️2022.11.29 5faa67b - [新增] 定时任务
BuildSqlType
配置,可设置生成不同数据库类型的SQL
语句 4.8.2.3 ⏱️2022.11.29 293f9bc !675 - [新增]
JobDetail
和Trigger
自定义ConvertToSQL
输出SQL
配置 4.8.2 ⏱️2022.11.27 0bb9d8f - [新增] 作业触发器
ResetOnlyOnce
属性,支持只运行一次的作业重新启动服务重复执行 4.8.1.5 ⏱️2022.11.25 a8be728 - [新增] 动态作业处理程序委托支持 4.8.1.8 ⏱️2022.11.27 e02266c
- [新增] 定时任务看板支持自定义刷新频率
-
突破性变化
- [调整] 定时任务动态作业
DynamicJob
委托/方法签名 4.8.7.10 ⏱️2023.03.14 6d56b53 - [调整] 定时任务底层所有代码,日志,注释,文档 4.8.1.10 ⏱️2022.12.05
- [调整] 定时任务动态作业
-
问题修复
- [修复] 定时任务通过作业
Id
删除作业不能删除作业触发器问题 4.8.7.35 ⏱️2023.04.05 312ca35 - [修复] 定时任务作业状态为
积压:0
和归档:6
时调用立即执行后不能恢复上一次状态 4.8.7.18 ⏱️2023.03.21 6f5aae8 - [修复] 定时任务更新作业
null
值默认被跳过问题 4.8.7.17 ⏱️2023.03.20 #I6OHO4 - [修复] 定时任务生成
SQL
语句没有处理'
转义问题 4.8.7.15 ⏱️2023.03.19 #I6NXKA - [修复] 定时任务服务在停止进程时会卡住
30秒
问题 4.8.7.8 ⏱️2023.03.13 #I6MI9I #I6MHOU - [修复] 定时任务看板删除不存在的作业触发器出现空异常 4.8.7.7 ⏱️2023.03.11 01d4466
- [修复] 定时任务
StartAll
出现个别作业显示无触发时间
的状态 4.8.4.14 ⏱️2023.01.12 #I6A08X - [修复] 定时任务停止作业触发器后运行记录不能写入最新记录问题 4.8.4.8 ⏱️2023.01.05 d4c553f
- [修复] 定时任务使用
Furion.Pure
包访问Dashboard
出现404
问题 4.8.4.2 ⏱️2023.01.02 21977b7 - [修复] 定时任务通过
scheduler.RemoveTrigger(triggerId)
报异常问题 4.8.3.3 ⏱️2022.12.09 #I65EQ1 - [修复] 定时任务作业触发器配置了
EndTime
和StartTime
之后Status
没有对应上 4.8.3.1 ⏱️2022.12.09 52a5506 - [修复] 定时任务通过
scheduler.AddTrigger(triggerBuilder)
无效的问题 4.8.3.1 ⏱️2022.12.09 #I65EQ1 - [修复] 作业拥有多个触发器时暂停作业后依然存在个别未暂停的清空(并发问题) 4.8.2.12 ⏱️2022.12.07 #I655W9
- [修复] 作业触发器不符合下一次执行规律但
NextRunTime
不为null
情况 4.8.1.5 ⏱️2022.11.25 a8be728 - [修复] 运行时启动/暂停作业无效问题 4.8.1.6 ⏱️2022.11.25 #I6368M
- [修复] 定时任务生成的
SQL
语句不支持MySQL
问题 4.8.1.7 ⏱️2022.11.26 #I638ZC
- [修复] 定时任务通过作业
-
其他更改
- [调整] 定时任务
GC
回收逻辑,避免高频添加作业导致尾毛刺
问题 4.8.8.3 ⏱️2023.04.21 #I6XIV8 - [调整] 定时任务日志设计,减少不必要的日志输出 4.8.8.3 ⏱️2023.04.21 #I6XI2L
- [调整] 定时任务动态委托作业持久化逻辑,采用不触发持久化操作 4.8.7.36 ⏱️2023.04.06 7bb58b6
- [调整] 定时任务
Http
作业HttpMethod
属性拼写错成HttpMedhod
4.8.7.24 ⏱️2023.03.28 !756 - [调整] 定时任务配置选项
BuilSqlType
属性命为BuildSqlType
4.8.7.11 ⏱️2023.03.15 92117b8 - [调整] 定时任务查看作业触发器运行记录由保存
10条
改为5条
4.8.7.7 ⏱️2023.03.07 01d4466 - [调整] 定时任务调度器时间精度,控制持续执行一年误差在
100ms
以内 4.8.2.9 ⏱️2022.12.01 334d089 - [调整] 定时任务作业计划工厂
GetNextRunJobs()
方法逻辑 4.8.2.7 ⏱️2022.11.30 #I63VS2
- [调整] 定时任务
-
文档
正文完
可以使用微信扫码关注公众号(ID:xzluomor)