最近,项目中需要执行一个计划任务,组长就让我了解一下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  就可以成功下载下来了,详见如图所示:

     MVC 使用Quartz.Net组件实现定时计划任务

第二步:在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();
                        }
                    }
                  
                }

            }
        }
    }
}
View Code

相关文章: