.Net?Core使用Coravel实现任务调度的完整步骤_实用技巧

来源:脚本之家  责任编辑:小易  
目录
前言简介用法原理总结参考链接

前言

前段时间需要在一个新项目里添加两个后台任务,去定时请求两个供应商的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<YourCoravelJob1>();
builder.Services.AddTransient<YourCoravelJob2>();

var app = builder.Build();

//配置任务
app.Services.UseScheduler(scheduler =>
    {
        scheduler.Schedule<YourCoravelJob1>().EveryFiveMinutes(); //每5分钟执行一次Job1
        scheduler.Schedule<YourCoravelJob2>().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<YourCoravelJob1> 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[s])
    // 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/coravelhttps://docs.coravel.nethttps://docs.microsoft.com/en-us/dotnet/core/extensions/generic-host 您可能感兴趣的文章:.NET?Core?分布式任务调度ScheduleMaster详解

  • 本文相关:
  • c#随机生成不重复字符串的两个不错方法
  • 关于net6?xunit?集成测试的问题
  • 精彩回顾!visual studio 2017正式版发布全纪录
  • asp.net(c#) ubb处理类
  • asp.net中实现根据匿名类、datatable、sql生成实体类
  • asp.net 获取目录下的文件数和文件夹数
  • asp.net core缓存静态资源示例详解
  • asp.net解决上传大文件问题的方法
  • .net mvc超过了最大请求长度的解决方法
  • asp.net中实现模板页
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧.net?core?分布式任务调度schedulemaster详解c#随机生成不重复字符串的两个不错方法关于net6?xunit?集成测试的问题精彩回顾!visual studio 2017正式版发布全纪录asp.net(c#) ubb处理类asp.net中实现根据匿名类、datatable、sql生成实体类asp.net 获取目录下的文件数和文件夹数asp.net core缓存静态资源示例详解asp.net解决上传大文件问题的方法.net mvc超过了最大请求长度的解决方法asp.net中实现模板页未将对象引用设置到对象的实例 (system.nullrefjava正则表达式 pattern和matcherasp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它的某一个依赖项。试图加载格asp.net中的几种弹出框提示基本实现方法asp.net“服务器应用程序不可用” 解决方法asp.net gridview 72般绝技asp.net生成excel并导出下载五种实现方法system.runtime.interopservicesasp.net对路径"xxxxx"的访问datagrid绑定list没有数据 表头不显示的解决方法asp.net下url处理两个小工具方法asp.net 转换人民币大小金额asp.net mvc+ef在服务端分页使用jqgrid以及jquery dasp.net?core实体类生产crud后台管理界面详解vs2012发布网站步骤asp.net分页和aspnetpager控件的使用深入理解__dopostback 客户端调用服务端事件asp.net中通过button打开另一个的frmcsrf在asp.net core中的处理方法详解
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved