Quartz.NET的具体使用

一、什么是Quartz.NET?

Quartz.NET 是一个功能齐全的开源作业调度系统,可用于从最小的应用程序到大型企业系统。

Quartz.NET是纯净的,它是一个.Net程序集,是非常流行的Java作业调度系统Quartz的C#实现。

二、Quartz.NET可以做什么?

Quartz.NET很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。

Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。

Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。

我此次选择Quartz.Net使用的版本是 3.3.3

这里强调一点:3.x的版本与2.x的版本使用方式有一定的差别

Quartz.NET官方文档:https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html

三、ASP.NET Core如何使用Quartz.NET?

首先我们需要创建一个ASP.NET Core web的项目,创建的过程就不展示了,我创建的是API项目,使用传统三层架构。

Quartz.NET的具体使用

项目创建好后,我们需要在NuGet包管理器中安装Quartz.AspNetCore和Quartz.Extensions.DependencyInjection

Quartz.NET的具体使用

Quartz.NET的具体使用


与2.x的使用方式不同,因为我使用的版本是3.3.3(此时最新版本)。我们就不像传统的创建调度中心类。传统的是定义作业工厂类【ResetJobFactory】,控制中心类【SchedulerCenter】,以及定期工作类【RegularWork】(如下图)在这就不过多介绍了。

Quartz.NET的具体使用

只需创建一个定期工作类【RegularWork】,并且继承Quartz.net的IJob接口,I_RegularWork_BLL能注入到RegularWork内需要UseMicrosoftDependencyInjectionJobFactory.

public class RegularWork : IJob { private readonly I_RegularWork_BLL I_bll; public RegularWork(I_RegularWork_BLL Ibll) { I_bll = Ibll; } public Task Execute(IJobExecutionContext context) { Input_RoomType model = new Input_RoomType(); model.currentPage = 1; model.pageSize = 1; var result = I_bll.getRoomTypeList(model); return Task.Run(() => { using (StreamWriter sw = new StreamWriter(@"F:/Quartz-NET.txt", true, Encoding.UTF8)) { sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff =>") + JsonConvert.SerializeObject(result)); } }); } }

在Startup.cs的ConfigureServices方法内通过services去注册RegularWork

//Quartz的工作单元 services.AddTransient<RegularWork>();

ConfigureServices方法内新增Quartz调度中心。Quartz.Extensions.DependencyInjection提供与Microsoft 依赖注入的集成,虽然Quartz 为作业工厂提供了两个内置替代方案,可以通过调用UseMicrosoftDependencyInjectionJobFactory或UseMicrosoftDependencyInjectionScopedJobFactory(已弃用)进行配置。

从 Quartz.NET 3.3.2 开始,默认作业工厂生成的所有作业都是作用域作业,不应再使用UseMicrosoftDependencyInjectionScopedJobFactory。

AddJob-新增一个工作单元;StartNow表示作业现在就开始执行;

WithInterval用于执行时间策略执行规则;

TimeSpan.FromSeconds表示执行的时间间隔,秒为单位;RepeatForever代表重复工作,可以用WithRepeatCount(5)代替RepeatForever;WithRepeatCount(5)代表执行5次

//Quartz调度中心 services.AddQuartz(q => { //用于注入 q.UseMicrosoftDependencyInjectionJobFactory(); // 基本Quartz调度器、作业和触发器配置 var jobKey = new JobKey("RegularWork", "regularWorkGroup"); q.AddJob<RegularWork>(jobKey, j => j .WithDescription("My regular work") ); q.AddTrigger(t => t .WithIdentity("Trigger") .ForJob(jobKey) .StartNow() .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10))//开始秒数 10s .RepeatForever())//持续工作 .WithDescription("My regular work trigger") ); });

ConfigureServices方法内新增添加Quartz服务

// ASP.NET核心托管-添加Quartz服务器 services.AddQuartzServer(options => { // 关闭时,我们希望作业正常完成 options.WaitForJobsToComplete = false; });

完整代码

//Quartz的工作单元 services.AddTransient(); //Quartz调度中心 services.AddQuartz(q => { //用于注入 q.UseMicrosoftDependencyInjectionJobFactory(); // 基本Quartz调度器、作业和触发器配置 var jobKey = new JobKey("RegularWork", "regularWorkGroup"); q.AddJob(jobKey, j => j .WithDescription("My regular work") ); q.AddTrigger(t => t .WithIdentity("Trigger") .ForJob(jobKey) .StartNow() .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10))//开始秒数 10s .WithRepeatCount(5))//持续工作 .WithDescription("My regular work trigger") ); }); // ASP.NET核心托管-添加Quartz服务 services.AddQuartzServer(options => { // 关闭时,我们希望作业正常完成 options.WaitForJobsToComplete = false; });

Quartz.NET的具体使用

这时候我们启动项目,定期工作开始执行。这时候的注入是有效的,查询数据后结果打印在F盘下的Quartz-NET.txt文件内(如下图)。

Quartz.NET的具体使用

四、Quartz的cron表达式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysfgy.html