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