如果我平时需要每个月对用户积分的清零,又或者是超过未付款时间商品的库存恢复等等定时计划任务,
一般都会使用Window service服务定时的来进行调我项目的某个接口来进行对应的业务处理。
不过对于Window service服务,除了不好调试外,还有就是局限性比较大,
一方面Window service服务是独立于自身项目,不能直接调用项目的业务方法,需要以调用请求接口的形式进行处理,并且每次需要独立部署安装服务,第二个就是如果一个项目有多个计划任务的话,也会比较麻烦。
Quartz.NET是一个强大、开源、轻量的作业调度框架,可用于winform和asp.net应用中。它灵活而不复杂。你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征,如:数据库支持,集群,插件,支持cron表达式等等
那我们现在来写个Demo
一.打开vs,创建一个ASP.Net MVC5项目,在NuGet中安装最新版本的 Quartz(截止到这篇文章,版本为3.0.6)
二.新建一个 MyJob 任务类,用来执行自己需要的计划任务
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using System.Web; namespace TimedTask { public class MyJob : IJob { public static int num = 0; public Task Execute(IJobExecutionContext context)//必须实现IJob接口下的Execute方法 { num++; Debug.WriteLine("任务执行 "+num+" 次"); return Task.CompletedTask; } } }
三.新建一个 MyScheduler 调度类,用来设置调度时间和要执行的任务
using Quartz; using Quartz.Impl; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Threading.Tasks; using System.Web; namespace TimedTask { public class MyScheduler { public static async Task Start() { ISchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); //从工厂中获取一个调度器实例化 await scheduler.Start(); //开始调度器 IJobDetail job = JobBuilder.Create< MyJob >().Build();//创建一个作业 //方式一,较为简单的可设置每隔多少秒,多少分钟,小时,天等时间来定时执行任务 //ITrigger trigger = TriggerBuilder.Create() // .WithSimpleSchedule(t => // t.WithIntervalInSeconds(5) //触发执行,5s一次 // .RepeatForever()) //重复执行 // .Build(); //方式二,利用Cron表达式来进行更为复杂的时间调度定时 ITrigger trigger =TriggerBuilder.Create() .WithCronSchedule("0 0/3 17-23 * * ?")//Cron表达式,每天的17-23点之间每三分钟执行一次 .Build(); await scheduler.ScheduleJob(job, trigger); //把作业,触发器加入调度器。 } } }
四.将调度类的开始方法配置在全局 Global.asax 中
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); MyScheduler.Start();//任务启动 } }
启动项目自动打开页面后会自动触发Application_Start()方法,任务也就开始执行
Tip:
关于Cron表达式相关资料可点击这里查看
最后提供一下官方的开源代码以及示例用于参考及学习:https://github.com/quartznet/quartznet/releases