在應用程序開發過程中,經常會需要定時任務調度功能,本篇博客介紹Asp.net Core如何使用Quartz完成定時調度
一、Quartz使用步驟
- 創建調度器scheduler,並開啟
- 創建Job作業
- 創建tigger觸發器
- 把作業和觸發器放入調度器中
二、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!