在应用程序开发过程中,经常会需要定时任务调度功能,本篇博客介绍Asp.net Core如何使用Quartz完成定时调度

一、Quartz使用步骤

  1. 创建调度器scheduler,并开启
  2. 创建Job作业
  3. 创建tigger触发器
  4. 把作业和触发器放入调度器中

二、Quartz的API

  • IScheduler - 与 scheduler 进行交互的主要接口
  • IJob - 你希望被 scheduler 执行的组件的接口
  • IJobDetail - 用于定义 Jobs 实例
  • ITrigger - 定义将会在scheduler上执行的 job 上的组件
  • JobBuilder - 用于定义或建立(define/build) JobDetail 实例,JobDetail定义了Jobs实例
  • TriggerBuilder - 用于定义或建立 Trigger 实例

三、使用Quartz

1、在使用Quartz之前需添加引用,在程序包管理控制台中执行命令安装依赖包

Install-Package Quartz -Version 3.0.7

2、创建调度类QuartzPro

using Quartz;
using Quartz.Impl;
using System.Collections.Specialized;
using System.Threading.Tasks;

namespace Test123
{
    public class QuartzPro
    {
        private IScheduler scheduler;
        /// <summary>
        /// 创建调度任务的入口
        /// </summary>
        /// <returns></returns>
        public async Task Start()
        {
            await StartJob();
        }
        /// <summary>
        /// 创建调度任务的公共调用中心
        /// </summary>
        /// <returns></returns>
        public async Task StartJob()
        {
            //创建一个工厂
            NameValueCollection param = new NameValueCollection()
            {
                { "testJob","test"}
            };
            //创建一个调度器
            StdSchedulerFactory factory = new StdSchedulerFactory(param);
            scheduler = await factory.GetScheduler();
            //开始调度器
            await scheduler.Start();
            //每三秒打印一个info日志
            await CreateJob<StartLogInfoJob>("_StartLogInfoJob", "StartLogInfoJob", " 0/3 * * * * ? ");
            //调度时间生成地址 http://cron.qqe2.com
        }
        /// <summary>
        /// 停止调度
        /// </summary>
        public void Stop()
        {
            scheduler.Shutdown();
            scheduler = null;
        }
        /// <summary>
        /// 创建运行的调度器
        /// </summary>
        public async Task CreateJob<T>(string name, string group, string cronTime) where T : IJob
        {
            //创建一个作业
            var job = JobBuilder.Create<T>()
                .WithIdentity("name" + name, "group" + group)
                .Build();
            //创建一个触发器
            var tigger = (ICronTrigger)TriggerBuilder.Create()
                .WithIdentity("name" + name, "group" + group)
                .StartNow()
                .WithCronSchedule(cronTime)
                .Build();
            //把作业和触发器放入调度器中
            await scheduler.ScheduleJob(job, tigger);
        }
    }
}

3、创建业务逻辑类StartLogInfoJob

using Quartz;
using System.Threading.Tasks;

namespace Test123
{
    public class StartLogInfoJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Start();
        }
        public async Task Start()
        {
            LogHelp.LogTxt("调度打印Info");
        }
    }
}

4、创建打印日志类LogHelp

using System;
using System.IO;
using System.Text;

namespace Test123
{
    public class LogHelp
    {
        public static void LogTxt(string info)
        {
            string FilePath = Environment.CurrentDirectory + "/LogTxt.txt";
            StringBuilder msg = new StringBuilder();
            msg.Append("*************************************** \r\n");
            msg.AppendFormat(" 打印时间: {0} \r\n", DateTime.Now);
            msg.AppendFormat(" 打印内容: {0} \r\n", info);
            msg.Append("***************************************");
            try
            {
                if (File.Exists(FilePath))
                {
                    using (StreamWriter tw = File.AppendText(FilePath))
                    {
                        tw.WriteLine(msg.ToString());
                    }
                }
                else
                {
                    TextWriter tw = new StreamWriter(FilePath);
                    tw.WriteLine(msg.ToString());
                    tw.Flush();
                    tw.Close();
                    tw = null;
                }
            }
            catch (Exception exx)
            {
                Console.ReadKey();
            }
        }
    }
}

5、重写控制台应用程序的Program文件

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using QuartzText;
using System;
using System.Linq;

namespace Test123
{
    class Program
    {
        static void Main(string[] args)
        {
            HandleStart();
            var webHostArgs = args.Where(arg => arg != "--console").ToArray();
            var host = WebHost.CreateDefaultBuilder(webHostArgs)
                .UseStartup<Startup>()
                .UseKestrel(options =>
                {
                    options.Limits.MinRequestBodyDataRate = null;
                })
                .Build();
            host.Run();
        }
        static void HandleStart()
        {
            try
            {
                new QuartzPro().Start().GetAwaiter().GetResult();
            }
            catch (Exception ex)
            {
                throw;
            }
        }
    }
}

日志每隔三秒打印一次

End!

01-06 00:23