IE盒子

搜索
查看: 111|回复: 0

.Net 6使用轻量级任务调度Coravel实践

[复制链接]

2

主题

11

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2023-3-6 14:13:48 | 显示全部楼层 |阅读模式
前言

前段时间需要在一个新项目里添加两个后台任务,去定时请求两个供应商的API来同步数据;由于项目本身只是一个很小的服务,不太希望引入太重的框架,同时也没持久化要求;于是我开始寻找在http://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站在了巨人的肩膀上,相比http://Quartz.Net、Hangfire,也拥有很多亮点特性,很值得尝试。
任何问题或者建议,欢迎评论区留言讨论~
参考链接


  • https://github.com/jamesmh/coravel
  • https://docs.coravel.net
  • https://docs.microsoft.com/en-us/dotnet/core/extensions/generic-host
作者:几秋
出处:https://www.cnblogs.com/netry/p/coravel-for-task-scheduling.html

版权声明:本文来源于网友收集或网友提供,仅供学习交流之用,如果有侵权,请转告版主或者留言,本公众号立即删除。
<hr/>



支持小薇

腾讯云福利
【腾讯云】多款云产品1折起,买云服务器送免费机器,最长免费续3个月
https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=a960b71e694dcc2f8b5a943535abd4a2&from=console
关注公众号:DotNet开发跳槽觉得不错,请点个在看呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表