Skip to main content

Collapsenav.Net.Tool.Quartz

nuget / Demo

Quartz.Net 是个被广泛使用的类库, 但我在使用的时候感觉配置任务的过程太繁琐, 特别不方便, 所以简单写了个扩展

定义Job

首先定义两个简单的job

// 普通Job
public class FirstJob : IJob
{
public FirstJob() { }
public Task Execute(IJobExecutionContext context)
{
Console.WriteLine($"{DateTime.Now.ToDefaultTimeString()}FirstJob");
}
}

一个是普通的job, 不需要使用依赖注入

// 依赖注入Job
public class DIJob : IJob
{
private readonly DIModel _model;
public DIJob(DIModel model){_model = model;}
public Task Execute(IJobExecutionContext context)
{
Console.WriteLine(_model.Name);
}
}

一个是需要使用依赖注入的job

手动注册

在 asp.net core 下注册使用是非常方便的

services
// 注册DIJob需要的DIModel
.AddSingleton(new DIModel{Name = "New DI Model"})
// 从现在开始, 每10秒执行一次FirstJob
.AddJob<FirstJob>(10)
// 每15秒执行一次DIJob
.AddJob<DIJob>("0/15 * * * * ?")
// 注册默认的 HostedService, 自动启动之前注册的Job
.AddDefaultQuartzService();

通过 AddJob 注册任务, 同时会注册支持依赖注入的 DIJobFactory

最后使用 AddDefaultQuartzService 注册一个 HostedService, 它会自动启动所有注册的Job

在引入了这个包的情况下, 只需要创建对应的Job, 然后根据需要进行注册即可

使用传统的xml配置进行注册

tip

可能有些项目还是要用xml进行配置

services.AddJobsFromXml("quartz.xml");
.AddDefaultQuartzService();
caution

使用xml进行配置时可能无法正常使用各种依赖注入功能, 手动注册服务可能会解决这个问题

使用json格式的配置

info

个人认为传统的xml配置太麻烦, 反正我是从来都没有记住过对应的配置格式, 都是直接抄的

所以简单做了两种json格式配置的支持

appsettings.json

{
// 具有简单格式的配置
"Quartz1": [
{
"JobName": "FirstJob",
"Len": 3
}
],
// 更加简单的只需要键值对即可的配置
"Quartz2": {
"SecondJob": "0/5 * * * * ?",
"ThirdJob": 1
}
}

然后简单注册一下

services
// 扫描程序集, 注册所有job
.AddAllJob()
// 使用 Quartz1 配置
.AddQuartzJsonConfig(builder.Configuration.GetSection("Quartz1"))
// 使用 Quartz2 配置
.AddQuartzJsonConfig(builder.Configuration.GetSection("Quartz2"))
.AddDefaultQuartzService();

需要先使用 AddAllJob 扫描并且注册所有能够查到的job

然后使用 AddQuartzJsonConfig 读取json配置

以上的代码和配置在程序启动之后会创建

一个 3s 执行一次的 FirstJob

一个 每5s 执行一次的 SecondJob

一个 1s 执行一次的 ThirdJob