.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实现任务调度
前言 前段时间需要在一个新项目里添加两个后台任务,去定时请求两个供应商的API来同步数据:由于项目本身只是一个很小的服务,不太希望引入太重的框架,同时也没持久化要求:于是我开始寻找在Quartz.Ne ...
- 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 ...
随机推荐
- CCIE DC Multicast Part 3.
Hi Guys! Here is part 3 of the Multicast Tutorials, Hopefully you have read the two previous posts h ...
- Vue.js的使用经验
Vue.js的使用经验 Vue.js的意义 解耦了视图与数据 可复用的组件 前端路由 状态管理 虚拟DOM Vue提供了很多实例属性与方法,都以$开头 $el可以访问挂载Vue实例的元素. $se ...
- Springboot 和hutool文件上传下载
1.放开上传限制 servlet: multipart: enabled: true #默认支持文件上传 max-file-size: -1 #不做限制 max-request-size: -1 #不 ...
- Nginx教程由浅入深
Nginx 一.安装Nginx 1.准备工作 (1)打开虚拟机,使用远程连接工具连接 linux 操作系统 (2)到 nginx 官网下载软件 http://nginx.org/ 2.开始进行 n ...
- 无锡哲讯谈食品行业如何利用SAP信息化方案实现数字化转型?
随着人们对生活品质的提高,大家对食品安全问题越来越重视.食品企业如果缺乏相应的监管和追溯,很容易陷入困难的被动局面.SAP系统可以对食品加工企业供应链.生产销售.食品质量控制等环节的信息化管控,降低食 ...
- 【Pr】如何裁剪视频得页面?
[Pr]如何裁剪视频得页面? 选择视频轨道 | 效果 | 裁剪(可以搜索) | 调整上下左右需要裁剪的大小 | 选择缩放,去掉黑边
- Cgroup学习笔记3—代码实现—相关结构和全局变量
基于 LInux-5.10 一.相关结构 1. 通过多次的 #define 和 #undef SUBSYS 宏来展开 cgroup_subsys.h 中通过 deconfig 使能的 cgroup 子 ...
- golang 实现twitter雪花算法
1 /* 2 * twitter雪花算法golang实现,生成唯一趋势自增id 3 * 保留位:63位 4 * 毫秒时间戳:[62-20]43位,时间范围[1970-01-01 00:00:00.00 ...
- iOS笔记 - Runtime 01:前期准备(isa结构 | Class结构 | 方法缓存)
前言 1 - OC机制很多都是基于 Runtime实现的,比如指针的弱引用.OC的消息机制属于 Runtime的一部分 2 - OC是一门动态语言,在程序运行过程中就可以修改已经编译好的代码 3 - ...
- Ios安装charles
1.浏览器打开chls.pro/ssh,不会弹出下载证书,所以使用以下方式: 2. 然后打开设置,可以看到描述文件,安装 检查:在"设置"-"描述文件"-查看描 ...