我们提供安全,免费的手游软件下载!
任务调度是业务系统中非常重要的基础功能,几乎所有的业务系统都会用到。市面上有许多成熟的第三方库,比如Quartz、Hangfire和Coravel。在本文中,我们将从零开始制作一个简易的任务调度系统。这个系统可以满足大多数业务系统分钟级别的粒度需求。
在这个任务调度系统中,我们将使用以下技术栈:BackgroundService和NCrontab库。
首先,我们定义一个简单的任务约定接口,其中包含一个执行方法:
public interface IScheduleTask
{
Task ExecuteAsync();
}
public abstract class ScheduleTask : IScheduleTask
{
public virtual Task ExecuteAsync()
{
return Task.CompletedTask;
}
}
接下来,我们定义一个特性标注任务执行周期等信息的metadata:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
public class ScheduleTaskAttribute : Attribute
{
public string Cron { get; set; }
public string? Description { get; set; }
public bool IsAsync { get; set; } = false;
public bool IsStartOnInit { get; set; } = false;
}
然后,我们定义一个调度器约定,用于判断当前的任务是否可以执行:
public interface IScheduler
{
bool CanRun(ScheduleTaskAttribute scheduleMetadata, DateTime referenceTime);
}
如果需要实现配置级别的任务调度或者动态的任务调度,我们可以再抽象一个Store:
public class ScheduleTaskMetadata
{
public Type ScheduleTaskType { get; set; }
public string Cron { get; set; }
public string? Description { get; set; }
public bool IsAsync { get; set; } = false;
public bool IsStartOnInit { get; set; } = false;
}
public interface IScheduleMetadataStore
{
Task> GetAllAsync();
}
接下来,我们实现一个Configuration级别的Store:
internal class ConfigurationScheduleMetadataStore : IScheduleMetadataStore
{
// 实现代码
}
然后,我们定义具体的事件类,用于多任务调度的事件处理或日志存储:
// 事件类的定义
接着,我们实现基于NCrontab的简易调度器,用于解析Cron表达式并判断传入时间是否可以执行ScheduleTask:
internal class SampleNCrontabScheduler : IScheduler
{
// 实现代码
}
最后,我们实现核心的BackgroundService,用于执行任务调度:
internal class ScheduleBackgroundService : BackgroundService
{
// 实现代码
}
最后,在收尾阶段,我们扩展IServiceCollection:
// IServiceCollection的扩展
最后,我们来测试一下:
// 测试代码
通过以上步骤,我们成功搭建了一个简易的任务调度系统。如果你对这个系统感兴趣,可以在GitHub上找到源代码并进行star:
GitHub链接:https://github.com/vipwan/Biwen.QuickApi
GitHub Scheduling链接:https://github.com/vipwan/Biwen.QuickApi/tree/master/Biwen.QuickApi/Scheduling
在这个系统中,我们还可以实现自己的Store,这里以放到内存为例。如果你对此感兴趣,可以自行开发一个面板管理。
通过本文的学习,我们成功搭建了一个简易的任务调度系统。当然,这只是一个简约版,还存在一些不足之处。欢迎大家对文章提出批评和建议,我们会不断改进和完善这个系统。
最后,希望本文对大家有所帮助,也希望大家能够在GitHub上支持我们的项目。
热门资讯