我们提供安全,免费的手游软件下载!

安卓手机游戏下载_安卓手机软件下载_安卓手机应用免费下载-先锋下载

当前位置: 主页 > 软件教程 > 软件教程

手把手教你如何自己制作一个简易的任务调度系统

来源:网络 更新时间:2024-05-15 18:30:58

任务调度是业务系统中非常重要的基础功能,几乎所有的业务系统都会用到。市面上有许多成熟的第三方库,比如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上支持我们的项目。