前言 前段时间需要在一个新项目里添加两个后台任务,去定时请求两个供应商的API来同步数据;由于项目本身只是一个很小的服务,不太希望引入太重的框架,同时也没持久化要求;于是我开始寻找在Quartz。Net、Hangfire之外,是否还有更为轻量级的框架满足我的要求,最终我选择了Coravel。简介 Coravel是一个专为。NETCore设计的。NETStandard库,除了任务调度,还提供了像队列、缓存、邮件等其它高级功能。特点就是对开发者十分友好,接入十分简单、优雅、流畅,接近于零配置。 作为一个生于2018年的年轻项目,后发优势明显,一开始就是基于。NetStandard2。0实现,没有历史负担,同时又可以利用很多。NetCore新特性。用法 首先安装Coravel包dotnetaddpackagecoravel 下面演示在。Net6MinimalAPI项目中接入Coravel并设置两个定时任务,是不是非常简单:)usingCvarbuilderWebApplication。CreateBuilder(args);只使用Coravel的任务调度功能builder。Services。AddScheduler();注册你自己的调度任务builder。Services。AddTransientYourCoravelJob1();builder。Services。AddTransientYourCoravelJob2();varappbuilder。Build();配置任务app。Services。UseScheduler(scheduler{scheduler。ScheduleYourCoravelJob1()。EveryFiveMinutes();每5分钟执行一次Job1scheduler。ScheduleYourCoravelJob2()。Hourly()。Monday();每周一每小时执行一次}); Coravel预先定义好了很多常用的间隔频率,非常的全面,像上面用到的EveryFiveMinutes()和Hourly(),是不是非常的简单优雅;当然Coravel也支持Cron表达式。 Invocable是Coravel中的核心概念,代表一个独立的任务,上面的YourCoravelJob1和YourCoravelJob2就是Invocable,Coravel直接调度这些Invocable。 要创建你自己的Invocable,只需实现IInvocable接口,在Invoke方法中编码你的任务。publicclassYourCoravelJob1:IInvocable{privatereadonlyILpublicYourCoravelJob1(ILoggerYourCoravelJob1logger){}publicasyncTaskInvoke(){logger。LogInformation(start。。);}}}原理 Coravel使用是的。NetCore2。0引入的IHostedService来实现后台定时任务。(因此只有。NetCore2。0以上的项目才能使用Coravel)publicinterfaceIHostedService{TaskStartAsync(CancellationTokencancellationToken);TaskStopAsync(CancellationTokencancellationToken);} SchedulerHost即实现了IHostedService接口,在其StartAsync方法中,当程序完全启动时,注册了一个的TimerpublicTaskStartAsync(CancellationTokencancellationToken){this。lifetime。ApplicationStarted。Register(InitializeAfterAppStarted);returnTask。CompletedT}privatevoidInitializeAfterAppStarted(){this。timernewTimer(this。RunSchedulerPerSecondAsync,null,TimeSpan。Zero,TimeSpan。FromSeconds(1));}privateasyncvoidRunSchedulerPerSecondAsync(objectstate){if(this。schedulerEnabled){awaitthis。scheduler。RunSchedulerAsync();}} 每秒调用RunSchedulerAsync激活到点的Invocable,同时会根据情况将任务分组,在单独的线程分开执行。从这里可以看到Coravel是支持秒级任务的。 在StopAsync方法中,会先等待正在执行的任务完成才会关闭,这个功能还是比较重要。publicasyncTaskStopAsync(CancellationTokencancellationToken){this。schedulerEPreventschangingthetimerfromfiringscheduledtasks。this。timer?。Change(Timeout。Infinite,0);this。scheduler。CancelAllCancellableTasks();Ifapreviousschedulerexecutionisstillrunning(duetosomelongrunningscheduledtask〔s〕)wedontwanttoshutdownwhiletheyarestillrunning。if(this。scheduler。IsRunning){this。logger。LogWarning(ScheduledTasksRunningMessage);}while(this。scheduler。IsRunning){awaitTask。Delay(50);}}总结 本文介绍一个对开发者友好的、轻量级、零配置的。NetStandard库Coravel,并演示了如何使用Coravel在。Net6MinimalAPI中创建定时任务,最后浅析了的实现原理。作为一个年轻的框架,Coravel站在了巨人的肩膀上,相比Quartz。Net、Hangfire,也拥有很多亮点特性,很值得尝试。 任何问题或者建议,欢迎评论区留言讨论参考链接https:github。comjamesmhcoravelhttps:docs。coravel。nethttps:docs。microsoft。comenusdotnetcoreextensionsgenerichost