ASP.NET Core使用Quartz实现定时任务

625 阅读1分钟

源码地址

github.com/quartznet/q…

官方文档

www.quartz-scheduler.net/

集成

1.安装

Install-Package Quartz.AspNetCore

<PackageReference Include="Quartz.AspNetCore" Version="3.4.0" />

2.创建工作单元

using Quartz;

namespace WebApplication1.ScheduledTask
{
    /// <summary>
    /// 工作项
    /// </summary>
    [DisallowConcurrentExecution]
    public class HelloJob : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            return Task.Run(() =>
            {
                Console.WriteLine(DateTime.Now + "HelloJob Start:**************Excuting Check**************");
            });
        }
    }
}

3.注入

#region 定时任务

builder.Services.AddQuartz(q =>
{
    //用于注入
    q.UseMicrosoftDependencyInjectionJobFactory();
    // 基本Quartz调度器、作业和触发器配置
    var jobKey = new JobKey("RegularWork", "regularWorkGroup");
    q.AddJob<HelloJob>(jobKey, j => j.WithDescription("MyJob"));
    q.AddTrigger(t => t
    .WithIdentity("Trigger")
    .ForJob(jobKey)
    .StartNow()
    .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(2)).RepeatForever())
         .WithDescription("My regular work trigger"));
});
// ASP.NET Core hosting
builder.Services.AddQuartzServer(options =>
{
    // true程序终止前等待任务完成
    options.WaitForJobsToComplete = true;
});

#endregion 定时任务

失败恢复和异常处理

JobExecutionException是主要捕获错误时操作错误的类

try
{
    return Task.Run(() =>
    {
        throw new Exception("错误信息");
    });
}
catch (Exception e)
{
    JobExecutionException jobExecutionException = new JobExecutionException(e);
    jobExecutionException.RefireImmediately = true;//出错后立马恢复
    return Task.Run(() => { });
}

配置项说明

  • [DisallowConcurrentExecution] 不允许任务并发执行

  • 触发器配置

    • WithCronSchedule,cron表达式支持
    • WithInterval,间隔时长
    • RepeatForever,永远重复
    • WithDescription,描述
    • WithRepeatCount,重复次数

核心说明

IScheduler:与调度程序进行交互的主要API。

IJob:由您希望由调度程序执行的组件实现的接口。

IJobDetail:用于定义Jobs的实例。

ITrigger:定义将在其上执行给定Job的计划的组件。

JobBuilder:用于定义/构建JobDetail实例,该实例定义Jobs实例。

TriggerBuilder:用于定义/构建触发器实例

SchedulerBuilder:用于定义/构建调度程序实例,需要Quartz 3.1或更高版本

参考文章

www.cnblogs.com/wyy1234/p/1…

www.cnblogs.com/yilezhu/p/1…