在应用程序开发过程中,经常会需要定时任务调度功能,本篇博客介绍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; /// <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!