标签:任务 引入 jpg 取出 invoke 错误 vat 代码注释 err
原文:基于Coravel定时任务之物联网设备数量统计
目录
在物联网系统中,需要计算底端所有设备的总数,显示在Dashboard中,进行一个总数的显示。包括离线,告警,停运等等数据都需要对应的总数的统计显示。
TaskScheduler库只支持.net,且需要结合windows任务计划程序来调用,pass。
Fluent Scheduler只支持.net,pass。
本身框架太重,而且使用复杂,pass。
相对Quartz轻量很多,使用也简单,而且有网页可以访问来观察任务执行情况,但是有一个致命的缺点就是只能支持分钟及以上的定时任务处理原因在于Hangfire用的是开源的NCrontab组件,跟linux上的crontab指令相似。在本应用中,总页数在1分钟之后更新,无法忍受。pass
hangfire 7.0 以上版本已经支持 Cron 表达式和秒级时间粒度了
在此感谢网友 @ Name="Jaly"
框架轻,使用简单,支持秒级定时任务。Coravel Pro可以连接数据库进行任务调度,Coravel Pro可以支持web可视化,将任务执行情况通过web显示出来。适合本应用背景。
在调用类库层安装Coravel。
在startup.cs中的ConfigureServices方法中进行依赖注入
services.AddScheduler();
在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。事件组播亦不建议用此库,可参考 https://www.cnblogs.com/JerryMouseLi/p/11012839.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;
public class StatisticTask: IInvocable
{
private readonly IStatisticsServices _statisticsServices;
private readonly IIPBoxServices _iPBoxServices;
public StatisticTask(IStatisticsServices statisticsServices, IIPBoxServices iPBoxServices,)
{
_statisticsServices = statisticsServices;
_iPBoxServices = iPBoxServices;
}
public async Task Invoke()
{
var _ipboxCount = await _iPBoxServices.CountAsync();//查询设备总数
var response = await _statisticsServices.GetAsync(1);//统计表取出
response.IpboxTotal = (int)_ipboxCount;//存入统计表缓存
await _statisticsServices.UpdateAsync(response);//更新统计表
}
}
注意:1.编写的任务一定要在 Invoke中,这属于固定格式;public async Task Invoke() {};2. 需要引入以下库:using Coravel.Invocable;
计算总设备总页数的计算可以在每次查询时生成,如下
var IPBoxCount = _unitOfWork.IPBoxRepository.Count();
return Json(new { pageModel, IPBoxCount });
这里需要VUE前端以Axios形式来定时获取统计表,后续会改成后端Coravel定时计算好之后,以SignalR形式主动推送到前端进行总览显示。
本文主要推荐Coravel这个定时工具的使用,让Coravel这个优雅的工具被更多人知晓使用。
标签:任务 引入 jpg 取出 invoke 错误 vat 代码注释 err
原文地址:https://www.cnblogs.com/lonelyxmas/p/11964830.html