.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来实现后台定时任务。
public interface IHostedService
{
Task StartAsync(CancellationToken cancellationToken);
Task StopAsync(CancellationToken cancellationToken);
}
在Coravel的SchedulerHost中,在 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,也拥有很多亮点特性,很值得尝试。
任何问题或者建议,欢迎评论区留言讨论~
参考链接
- https://github.com/jamesmh/coravel
- https://docs.coravel.net
- https://docs.microsoft.com/en-us/dotnet/core/extensions/generic-host
.Net Core使用Coravel实现任务调度的更多相关文章
- Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手
概述 ScheduleMaster是一个开源的分布式任务调度系统,它基于Asp.Net Core平台构建,支持跨平台多节点部署运行. 它的项目主页在这里: https://github.com/hey ...
- .net core中使用Quartz任务调度
使用xml配置Quartz任务调度程序 1.Nuget Install-Package Quartz Install-Package Quartz.Plugins 2.站点根目录下加入文件quartz ...
- Asp.Net Core下的开源任务调度平台ScheduleMaster
从何说起 2017年初的时候,由于当时项目需要做了一个乞丐版定时调度系统,那时候只在单机上实现了核心的调度功能.做这个玩意之前也调研了社区中开源的解决方案,找了几个实地部署试跑了一下,其实都很不错.但 ...
- 【分享】Asp.net Core相关教程及开源项目
入门 全新的ASP.NET: https://www.cnblogs.com/Leo_wl/p/5654828.html 在IIS上部署你的ASP.NET Core项目: https://www.c ...
- Asp.net Core相关教程及开源项目推荐
入门 全新的ASP.NET: https://www.cnblogs.com/Leo_wl/p/5654828.html 在IIS上部署你的ASP.NET Core项目: https://www.c ...
- Uwl.Admin.Core开源框架(二) 使用QuartzNet
Uwl.Admin.Core中使用QuartzNet定时任务模块: 本文负责讲解RabbitMQ的使用 Uwl.Admin.Core使用的技术有: *.Async和Await 异步编程 *.Repos ...
- Asp.Net Core2.0 基于QuartzNet任务管理系统
Quartz.NET官网地址:https://www.quartz-scheduler.net/ Quartz.NET文档地址:https://www.quartz-scheduler.net/doc ...
- Net Core2.0 基于QuartzNet任务管理系统
Net Core2.0 基于QuartzNet任务管理系统 Quartz.NET官网地址:https://www.quartz-scheduler.net/ Quartz.NET文档地址:https: ...
- sonar:默认的扫描规则
https://blog.csdn.net/liumiaocn/article/details/83550309 https://note.youdao.com/ynoteshare1/index.h ...
随机推荐
- CentOS7及以下版本安装禅道
由于是CentOS7以及以下系统,禅道已经集成了 Apache Nginx Mysql 服务,不需要我们再次安装搭建,我们只进行解压使用就好: 一.进行下载安装 1.在终端命令中输入以下命令确认系统是 ...
- JavaScript String -> Number
五种将String类型转化为Number类型的方法: 方法一:使用一元运算符:eg:字符串'5' +'5' -> 5; 5+null -> 5(null转化为0); '5'+nul ...
- GDKOI 2021 Day1 PJ 爆炸记
早上睡到 7:10 分才想起今天有 GDKOI ,赶紧去买了一个面包赶去机房 发现隔壁的大奆都过来了.比赛时由于昨晚一直没睡好,打了两个小时的哈欠 T1 :暴力模拟 根据 \(r\) 和 \(c\) ...
- UiPathExcel读取操作
一.Uipath操作Excel的相关基本概念 1.UiPath操作Excel的两组方法 App Integration > Excel VS System > File > W ...
- Docker Buildx使用教程:使用Buildx构建多平台镜像
写在前边 记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像. 构建环境 软件名 版本 Ubuntu 18.04.2 LTS Docker ...
- 今天安装了eclipse,myeclipse,满满的回忆
代码半生,编码半世,ideacode失效,安装了eclipse,那熟悉的界面,俨然又回到了从前,当初我们还在用structs,eclipse,webwork,那时候还在用jbuilder,但是算是老套 ...
- Java多线程交替打印
1. synchronized实现双线程交替打印 class Print implements Runnable{ static int i=0; static final int n=100; @O ...
- YYYYMMdd和yyyyMMdd的区别
YYYYMMdd的 YYYY 是表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年.比如今天是2021-12-29 星期三,然后本周六是2022-01-01,存 ...
- 乐观锁和悲观锁在kubernetes中的应用
数据竞争和竞态条件 Go并发中有两个重要的概念:数据竞争(data race)和竞争条件(race condition).在并发程序中,竞争问题可能是程序面临的最难也是最不容易发现的错误之一. 当有两 ...
- Note -「狄利克雷前缀和」
学到一个诡异东西,当个 Trick 处理用吧. 现在有一个形如 \(\sum \limits _{i = 1} ^{n} \sum \limits _{d | i} f(d)\) 的柿子,不难发现可以 ...