Asp.Net Core 基于Coravel 定时任务

  • A+
所属分类:.NetCore

Asp.Net Core 基于Coravel 定时任务

1 应用背景

由于360服务监控平台已经开始收费,自己写的签到服务不能通过360服务监控平台来实现定时调用接口了,所以要填上之前因为懒留下的坑……

2 对比各家定时库

2.1 TaskScheduler

TaskScheduler库只支持.net,且需要结合windows任务计划程序来调用。

2.2 Fluent Scheduler

Fluent Scheduler只支持.net。

2.3 Quartz.net

本身框架太重,而且使用复杂。

2.4 Hangfire

相对Quartz轻量很多,使用也简单,而且有网页可以访问来观察任务执行情况,但是有一个致命的缺点就是只能支持分钟及以上的定时任务处理原因在于Hangfire用的是开源的NCrontab组件,跟linux上的crontab指令相似。

2.5 Coravel

框架轻,使用简单,支持秒级定时任务。Coravel Pro可以连接数据库进行任务调度,Coravel Pro可以支持web可视化,将任务执行情况通过web显示出来。

3 Coravel的一般使用

3.1 Nuget安装

  1. Install-Package Coravel  

3.2 依赖注入

Startup.cs中的ConfigureServices方法中进行依赖注入

  1. services.AddScheduler();  

3.3 配置调度器

Startup.cs中的Configure方法中配置链两个定时任务

  1. var provider = app.ApplicationServices;  
  2. provider.UseScheduler(scheduler =>  
  3. {//配置任务1方法  
  4.     scheduler.Schedule(() => Console.WriteLine("Every second during the week."))  
  5.         //工作日每隔1秒输出  
  6.         .EverySecond()  
  7.         .Weekday();  
  8. });  
  9. provider.UseScheduler(scheduler =>  
  10. {//配置任务2方法  
  11.     scheduler.Schedule(() => Console.WriteLine("Every 5 second during the week."))  
  12.         //工作日每隔5秒输出  
  13.         .EverySeconds(5)  
  14.         .Weekday();  
  15. });  

3.4 运行程序,观察输出

Asp.Net Core 基于Coravel 定时任务

  • 从上图结果中可以看到任务1每隔1秒打印输出;任务2每隔5秒打印输出。
  • 3.5 Cron 表达式

  • Coravel 支持Cron Expressions,有需要的可以根据应用场景设置Cron表达式
  • * * * * * run every minute
  • 00 13 * * * run at 1:00 pm daily
  • 00 1,2,3 * * * run at 1:00 pm, 2:00 pm and 3:00 pm daily
  • 00 1-3 * * * same as above
  • 00 /2 * * run every two hours on the hour
  • 3.6 其他功能支持

    此外,Coravel还支持任务队列,缓存,事件组播,邮件等。任务队列可依据读者使用情况,缓存不建议用此组件,可用Easycache。事件组播、邮件也不建议用此库。

    3.7 Coravel Pro

    Coravel Pro可以连接数据库进行任务调度,Coravel Pro可以支持web可视化,将任务执行情况通过web显示出来。在这里不做详细介绍,有需要的读者可自行研究。

    4 Coravel的松耦合使用(定时执行原签到接口)

    4.1 依赖注入自定义类

    ConfigureServices中对松耦合的类RunScheduledTasksAll进行依赖注入

    1. services.AddScheduler();  
    2. services.AddTransient<RunScheduledTasksAll>();  

    4.2 配置调度器

    Startup.cs中的Configure方法中配置自定义松耦合任务

    1. var provider = app.ApplicationServices;  
    2. provider.UseScheduler(scheduler =>  
    3. {  
    4.     scheduler.Schedule<RunScheduledTasksAll>()  
    5.         //5分钟执行一次  
    6.         .EveryFiveMinutes()  
    7.         .Weekday();  
    8. });  

    4.3 编写松耦合任务的代码

    1. public class RunScheduledTasksAll: IInvocable  
    2. {  
    3.     private IScheduledTasksManager scheduledTasksManager;  
    4.     /// <summary>  
    5.     /// 构造函数  
    6.     /// </summary>  
    7.     /// <param name="scheduledTasksManager"></param>  
    8.     public RunScheduledTasksAll(IScheduledTasksManager scheduledTasksManager)  
    9.     {  
    10.         this.scheduledTasksManager = scheduledTasksManager;  
    11.     }  
    12.   
    13.     public async Task Invoke()  
    14.     {  
    15.         //注意:1.编写的任务一定要在 Invoke中,这属于固定格式;public async Task Invoke() { };  
    16.         //2. 需要引入以下库:using Coravel.Invocable;  
    17.   
    18.         //按顺序执行计划任务  
    19.         scheduledTasksManager.RunScheduledTasksAll();  
    20.     }  
    21. }  
  • 注意:1.编写的任务一定要在 Invoke中,这属于固定格式;public async Task Invoke() {};2. 需要引入以下库:using Coravel.Invocable;
  • 6 解决IIS程序池闲置超时引起的定时任务停止执行问题

    6.1 问题描述

    项目中用Coravel执行一个定时任务(每隔5分钟执行一个Job),正常情况,Coravel定时任务会5分钟执行一次,但IIS程序池闲置超时默认为20分钟,造成的结果是:定时任务只执行了4次。那么怎么解决程序池闲置超时引起Coravel定时任务停止执行问题?

    6.2 解决方案

  • 第一步 设置IIS默认闲置超时为1740(跟程序池默认回收时间1740)
  • 通过设置程序池--高级设置--模型设计--闲置超时,设置为1740(29小时)
  • 第二步 创建Windows计划任务
  • 创建一个每天0点执行的计划任务来访问一下我们程序中的任意接口来保持IIS不被回收
  • 钰玺

    发表评论

    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: