惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Vercel News
Vercel News
N
Netflix TechBlog - Medium
C
Check Point Blog
MyScale Blog
MyScale Blog
The GitHub Blog
The GitHub Blog
Blog — PlanetScale
Blog — PlanetScale
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
博客园 - Franky
MongoDB | Blog
MongoDB | Blog
I
InfoQ
Hugging Face - Blog
Hugging Face - Blog
Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
腾讯CDC
V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
T
The Blog of Author Tim Ferriss
V
V2EX
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
U
Unit 42
B
Blog

博客园 - Gu

上位机开发人员真的需要物理 PLC 或博途吗?我们仅仅需要一个模拟 S7 通讯的工具 检查采集程序心跳的程序挂了。看来得套娃,再来一个检测检测程序的程序 Web.INI vue前端项目,默认request 30秒超时,如何设置某个导出动作1分钟才超时 提示coreclr.dll 出错?栈溢出? Blazor 循环的迷思 Grafana 可视化图表 mysqldump 导出批量忽略某些表的bat脚本 cron表达式的讲解 若依 自定义注解@Log,实现aop java 处理日期时间有多个类,用哪个比较好 文件同步工具 西门子PLC Modus TCP通讯 thingsboard 接口 圆度和径向跳动,直线度的区别 安装thingsboard 3.7 dotNET_Reactor 混淆net程序时, 一些全局变量要加上volatile 修饰符, 不然优化到不会改变 Ant Design Blazor Table 组件的 自定义分页样式, 显示全部记录数,ShowTotal 安全可靠测评结果公告(2023年第1号) 2023-12-26 来源: 中国信息安全测评中心 Blazor 和Known 框架学习
.Net 6使用轻量级任务调度Coravel实践
Gu · 2025-01-24 · via 博客园 - Gu

前言

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


 

总结

本文介绍一个对开发者友好的、轻量级、零配置的.Net Standard库Coravel,并演示了如何使用Coravel在.Net 6 Minimal API中创建定时任务,最后浅析了的实现原理。作为一个年轻的框架,Coravel站在了巨人的肩膀上,相比Quartz.Net、Hangfire,也拥有很多亮点特性,很值得尝试。