最近,项目中需要执行一个计划任务,组长就让我了解一下Quartz.net 这个组件,挺简单的一个组件,实现起来特别的方便,灵活,值得推荐给大家一起学习一下这个小工具。以前我有的时候是使用定时器Timer,还有数据库中的 计划任务,后来发现这些真的太不好用了。下面我介绍一下这个组件的使用步骤和注意事项,仅供参考,有什么不对的地方,希望大家多多见谅并帮我指出来,大家 相互学习嘛。
首先,简述一下Quartz.net 组件的基本概念:它是一个简单的执行任务计划的组件,基本包括这三部分:Job(作业)、Trigger(触发器)、scheduler(调度器)。
1.Job 作业:需要在任务计划中执行的具体逻辑操作
2.Trigger 触发器:需要什么时间什么规则来去执行Job 作业
3.scheduler 调度器 :将Job 和 Trigger 注册到 scheduler 调度器中,主要负责协调Job、Trigger 的运行
第一步:下载Quartz.net 组件
在VS 中 工具 > NuGet 程序包管理器 > 程序包管理控制台 点击打开 在控制台上输入 Install-Package Quartz 就可以成功下载下来了,详见如图所示:
第二步:在VS 中我们创建一个类库,这样方便我们移植程序,也方便我们代码的分离;一个Job 创建一个实例类,下面我会创建两个实例类一个是UpdateCompleteJob.cs、UpdateAutoCancelStateJob.cs (之所以创建两个Job是为了能方便大家了解这个组件可以同时执行多个任务)
(1) UpdateCompleteJob.cs 代码如下:
using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WechatMall.Application.BLL; using WechatMall.Application.Data; using WechatMall.Model.ExpressModel; namespace WechatMallJobLibrary { public class UpdateCompleteJob : IJob { /// <summary> ///在Job 中我们必须实现IJob接口中的Execute 这个方法,才能正确的使用Job /// </summary> public void Execute(IJobExecutionContext context) { using (var _ctx = new BtDbContext()) { List<string> expressCode = new List<string>(); var query = _ctx.Orders.Where(c => c.OrderStatus == WechatMall.Common.EnumHelper.OrderStatus.Sended && c.PayStatus == WechatMall.Common.EnumHelper.PayStatus.Paid).OrderBy(c => c.CreateTime).ToList().Take(20); foreach (var item in query) { if (!string.IsNullOrEmpty(item.ExpressCode)) { ExpressModel model = ExpressAPI._GetExpress(item.ExpressCode); //确定 快递已签收 修改订单状态 已完成 if (model.state == "3" && model.ischeck == "1") { var order = _ctx.Orders.FirstOrDefault( c => c.OrderId == item.OrderId); order.OrderStatus = WechatMall.Common.EnumHelper.OrderStatus.Over; order.FlowStatus = WechatMall.Common.EnumHelper.FlowStatus.Over; order.UpdateTime = DateTime.Now; _ctx.SaveChanges(); } } } } } } }