搜索

查看: 3057|回复: 11

[ASP.NET] .Net Core使用Coravel实现任务调度的完整步骤

[复制链接]
发表于 2023-5-4 11:33:10 | 显示全部楼层 |阅读模式
Editor 2023-5-4 11:33:10 3057 11 看全部
目录
  • 前言
  • 简介
  • 用法
  • 原理
  • 总结
  • 参考链接
    前言
    前段时间需要在一个新项目里添加两个后台任务,去定时请求两个供应商的API来同步数据;由于项目本身只是一个很小的服务,不太希望引入太重的框架,同时也没持久化要求;于是我开始寻找在Quartz.Net、Hangfire之外,是否还有更为轻量级的框架满足我的要求,最终我选择了Coravel.

    简介
    Coravel是一个专为.NET Core设计的.NET Standard库,除了任务调度,还提供了像队列、缓存、邮件等其它高级功能。特点就是对开发者十分友好,接入十分简单、优雅、流畅,接近于零配置。
    作为一个生于2018年的年轻项目,后发优势明显,一开始就是基于.Net Standard 2.0实现,没有历史负担,同时又可以利用很多.Net Core新特性。

    用法
    首先安装Coravel包
    dotnet add package coravel
    下面演示在.Net 6 Minimal API项目中接入Coravel并设置两个定时任务,是不是非常简单:)
    using Coravel;
    var builder = WebApplication.CreateBuilder(args);
    //只使用Coravel的任务调度功能
    builder.Services.AddScheduler();
    //注册你自己的调度任务
    builder.Services.AddTransient();
    builder.Services.AddTransient();
    var app = builder.Build();
    //配置任务
    app.Services.UseScheduler(scheduler =>
        {
            scheduler.Schedule().EveryFiveMinutes(); //每5分钟执行一次Job1
            scheduler.Schedule().Hourly().Monday(); // 每周一每小时执行一次
        });
    Coravel预先定义好了很多常用的间隔频率,非常的全面,像上面用到的 EveryFiveMinutes() 和 Hourly(),是不是非常的简单优雅;当然Coravel也支持Cron表达式。
    Invocable 是Coravel中的核心概念,代表一个独立的任务,上面的YourCoravelJob1和YourCoravelJob2就是 Invocable,Coravel直接调度这些Invocable。
    要创建你自己的Invocable,只需实现 IInvocable接口,在 Invoke方法中编码你的任务。
    public class YourCoravelJob1 : IInvocable
        {
            private readonly ILogger _logger;
            public YourCoravelJob1(ILogger logger)
            {
                _logger = logger;
            }
            public async Task Invoke()
            {
                 _logger.LogInformation("start..");
            }
        }
    }

    原理
    Coravel使用是的.Net Core 2.0引入的IHostedService来实现后台定时任务。(因此只有.Net Core 2.0以上的项目才能使用Coravel)
    public interface IHostedService
    {
        Task StartAsync(CancellationToken cancellationToken);
        Task StopAsync(CancellationToken cancellationToken);
    }
    SchedulerHost即实现了IHostedService接口,在 其StartAsync方法中,当程序完全启动时,注册了一个的Timer
    public Task StartAsync(CancellationToken cancellationToken)
    {
        this._lifetime.ApplicationStarted.Register(InitializeAfterAppStarted);
        return Task.CompletedTask;
    }
    private void InitializeAfterAppStarted()
    {
        this._timer = new Timer(this.RunSchedulerPerSecondAsync, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
    }
    private async void RunSchedulerPerSecondAsync(object state)
    {
    if (this._schedulerEnabled)
    {
       await this._scheduler.RunSchedulerAsync();
      }
    }
    每秒调用 RunSchedulerAsync 激活到点的Invocable,同时会根据情况将任务分组,在单独的线程分开执行。从这里可以看到Coravel是支持秒级任务的。
    在 StopAsync 方法中,会先等待正在执行的任务完成才会关闭,这个功能还是比较重要。
    public async Task StopAsync(CancellationToken cancellationToken)
    {
        this._schedulerEnabled = false; // Prevents changing the timer from firing scheduled tasks.
        this._timer?.Change(Timeout.Infinite, 0);
        this._scheduler.CancelAllCancellableTasks();
        // If a previous scheduler execution is still running (due to some long-running scheduled task)
        // we don't want to shutdown while they are still running.
        if (this._scheduler.IsRunning)
        {
            this._logger.LogWarning(ScheduledTasksRunningMessage);
        }
        while (this._scheduler.IsRunning)
        {
            await Task.Delay(50);
        }
    }

    总结
    本文介绍一个对开发者友好的、轻量级、零配置的.Net Standard库Coravel,并演示了如何使用Coravel在.Net 6 Minimal API中创建定时任务,最后浅析了的实现原理。作为一个年轻的框架,Coravel站在了巨人的肩膀上,相比Quartz.Net、Hangfire,也拥有很多亮点特性,很值得尝试。
    到此这篇关于.Net Core使用Coravel实现任务调度的文章就介绍到这了,更多相关.Net Core Coravel实现任务调度内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛

    参考链接
  • https://github.com/jamesmh/coravel
  • https://docs.coravel.net
  • https://docs.microsoft.com/en-us/dotnet/core/extensions/generic-host
  • 回复

    使用道具 举报

    发表于 2023-6-28 18:36:28 | 显示全部楼层
    戏做顿 2023-6-28 18:36:28 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-28 21:07:23 | 显示全部楼层
    老橡树1 2023-6-28 21:07:23 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-28 23:39:17 | 显示全部楼层
    丁侦球 2023-6-28 23:39:17 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-29 00:18:28 | 显示全部楼层
    井底燕雀傥 2023-6-29 00:18:28 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 16:19:05 | 显示全部楼层
    李志敏 2023-6-29 16:19:05 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-29 20:30:45 | 显示全部楼层
    123456868 2023-6-29 20:30:45 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-6-29 21:46:55 | 显示全部楼层
    普通人物怨 2023-6-29 21:46:55 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-6-30 11:58:09 | 显示全部楼层
    123456823 2023-6-30 11:58:09 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 22:18:41 | 显示全部楼层
    Gordon520 2023-6-30 22:18:41 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表