在物联网系统中,须要计算底端全部设备的总数,除以分页每页显示数量,进行一个总页数的显示。包括状态,告警,日志等等数据都须要对应的总页数的显示。
linux
TaskScheduler库只支持.net,且须要结合windows任务计划程序来调用,pass。git
Fluent Scheduler只支持.net,pass。github
自己框架过重,并且使用复杂,pass。web
相对Quartz轻量不少,使用也简单,并且有网页能够访问来观察任务执行状况,可是有一个致命的缺点就是只能支持分钟及以上的定时任务处理缘由在于Hangfire用的是开源的NCrontab组件,跟linux上的crontab指令类似。在本应用中,总页数在1分钟以后更新,没法忍受。pass数据库
框架轻,使用简单,支持秒级定时任务。Coravel Pro能够链接数据库进行任务调度,Coravel Pro能够支持web可视化,将任务执行状况经过web显示出来。适合本应用背景。
windows
在调用类库层安装Coravel。
缓存
在startup.cs中的ConfigureServices方法中进行依赖注入
services.AddScheduler();
app
在startup.cs中的Configure方法中配置链两个定时任务框架
var provider = app.ApplicationServices; provider.UseScheduler(scheduler => {//配置任务1方法 scheduler.Schedule(() => Console.WriteLine("Every second during the week.")) //工做日每隔1秒输出 .EverySecond() .Weekday(); }); provider.UseScheduler(scheduler => {//配置任务2方法 scheduler.Schedule(() => Console.WriteLine("Every 5 second during the week.")) //工做日每隔5秒输出 .EverySeconds(5) .Weekday(); });
从上图结果中能够看到任务1每隔1秒打印输出;任务2每隔5秒打印输出,正确。
Coravel 支持Cron Expressions,有须要的能够根据应用场景设置Cron表达式
Coravel 发布于2018年6月28日,才刚起步还不成熟,我在调试工做日秒级定时任务的时候会报错。
详见#91 https://github.com/jamesmh/coravel/issues/91
做者在几小时内利用工做时间,解决了问题,还发布到nuget2.5.1。非常感动。
此外,Coravel还支持任务队列,缓存,事件组播,邮件等。任务队列可依据读者使用状况,视状况另起一篇,缓存不建议用此组件,可用Easycache。事件组播亦不建议用此库,可参考 http://www.javashuo.com/article/p-pfmnssgh-er.html。 邮件亦不建议用此组件。
Coravel Pro能够链接数据库进行任务调度,Coravel Pro能够支持web可视化,将任务执行状况经过web显示出来。在这里不作详细介绍,有须要的读者可自行研究。
ConfigureServices中对松耦合的类Statistic进行依赖注入
services.AddTransient<Statistic>();
在startup.cs中的Configure方法中配置自定义松耦合任务
var provider = app.ApplicationServices; provider.UseScheduler(scheduler => { scheduler.Schedule<Statistic>() .EverySecond() .Weekday(); });
详细说明,见代码注释。
using Coravel.Invocable;//须要引用此类库来进行自定义任务 using IBMS.Infrastruct.UoW; using System; using System.Threading.Tasks; namespace IBMS.WEBAPI.Extension { public class Statistic: IInvocable { //工做单元依赖注入 UnitOfWork _unitOfWork; public Statistic(UnitOfWork unitOfWork) { _unitOfWork = unitOfWork; } public async Task Invoke() { //按每页10分页计算出来的总页数 var IPBoxCount = _unitOfWork.IPBoxRepository.Count()/10+1; Console.WriteLine("Every second during the week."); Console.WriteLine("Count:{0}", IPBoxCount); } } }
注意:1.编写的任务必定要在 Invoke中,这属于固定格式;public async Task Invoke() {};2. 须要引入如下库:using Coravel.Invocable;
从结果能够看出,定时计算出总页数11页定时1秒输出。同时能够看到EF Cor ORM最终生成的数据库语句,与咱们的指望相符。
SELECT COUNT(*) FROM `IPBox` AS `c`
固然总页数的计算能够在每次查询时生成,以下
var IPBoxCount = _unitOfWork.IPBoxRepository.Count()/10+1; return Json(new { pageModel, IPBoxCount });
我的以为,若是数据量小能够直接查询总数,计算总页数而后返回的方法;若是数据量很大,好比100万的数据(状态,告警,日志信息等),可能会拖慢速度,使网页变卡,则使用定时计算总页数的方法为佳。您以为呢?不合理的地方能够留言。笔者发如今国内写Coravel的文章尚未,若是以为本文能够,欢迎点右下角推荐,让Coravel这个优雅的工具被更多人知晓使用。