ASP.NET Core使用Quartz定時調度


在應用程序開發過程中,經常會需要定時任務調度功能,本篇博客介紹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;
        // 創建調度任務的入口
        public async Task Start()
        {
            await StartJob();
        }
        // 創建調度任務的公共調用中心
        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
        }
        // 停止調度
        public void Stop()
        {
            scheduler.Shutdown();
            scheduler = null;
        }
        // 創建運行的調度器
        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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM