Quartz是一个流行的开源任务调度库,它提供了强大的任务调度功能,可以方便地与.NET应用程序集成。
Quartz.NET是Quartz的.NET版本,它是为.NET框架编写的,并提供了与.NET应用程序的集成。它支持各种调度策略,包括定时、间隔、日历等,可以灵活地配置和管理任务。
Quartz.NET具有以下特点:
Quartz.NET的主要组件包括调度器、触发器和作业。调度器是Quartz.NET的核心组件,负责管理和协调任务的执行。触发器定义了任务执行的时间和频率,可以根据需要设置时间表达式。作业是实际执行的任务,可以是任何.NET类和方法。
Quartz.NET的使用非常灵活,可以通过XML配置文件、代码或依赖注入进行配置和管理。它提供了丰富的API和文档,可以方便地定制和扩展。此外,Quartz.NET还支持多种类型的触发器,包括SimpleTrigger、CronTrigger和CalendarIntervalTrigger等。这些触发器可以根据需要选择,以满足不同的调度需求。
总之,Quartz.NET是一个功能强大的任务调度库,适用于各种.NET应用程序。它可以提高生产力和效率,减少人工干预和管理成本,为企业级应用提供更高级别的自动化和可扩展性。
触发器介绍:
触发器类型一共有4种。
1、WithSimpleSchedule
- ITrigger simpleTrigger = TriggerBuilder.Create()
- .WithIdentity("trigger1", "group1")
- .WithSimpleSchedule(x => x.WithIntervalInHours(2)
- .RepeatForever()
- )
- .Build();
指定时间间隔,有WithInterval(TimeSpan)、WithIntervalInHours、WithIntervalInMinutes、WithIntervalInSeconds。
2、WithDailyTimeIntervalSchedule
- ITrigger dailyTimeTrigger = TriggerBuilder.Create()
- .WithIdentity("trigger1", "group1")
- .WithDailyTimeIntervalSchedule(x => x.OnEveryDay().WithIntervalInSeconds(5)) //5秒执行一次
- .Build();
支持更精确的时间配置,它可以选择每天、周末、工作日、周几,同时指定的时间范围及执行时间周期。
3、WithCalendarIntervalSchedule
- ITrigger calendarTimeTrigger = TriggerBuilder.Create()
- .WithIdentity("trigger1", "group1")
- .WithCalendarIntervalSchedule(x => x.WithIntervalInSeconds(5)) //5秒执行一次
- .Build();
它可以支持年、月、周、日、时、分、秒及夏令时的设置,可以用于创建一个在指定的时间间隔内重复运行的调度任务。
- Trigger trigger = TriggerBuilder.Create()
- .WithIdentity("trigger1", "group1")
- .WithCalendarIntervalSchedule(x => x
- .WithInterval(TimeSpan.FromDays(1))
- .WithAlignToStartTime(true).Build());
在上面的例子中,我们创建了一个每天都会触发一次的 Trigger。其中 WithInterval 方法设置了调度任务的时间间隔,而 WithAlignToStartTime 则让任务开始时间对齐到开始时间的下一个时间间隔。这样做的目的是避免重复调度。例如,如果设置为每两天执行一次,并且当前是第一天,则下一次执行将在两天后,而不是立即执行。
4、WithCronSchedule
- ITrigger cronTrigger = TriggerBuilder.Create()
- .WithIdentity("trigger1", "group1")
- .WithCronSchedule("0 0/1 * * * ?")
- .UsingJobData("order_no", Guid.NewGuid().ToString())//作业数据传递
- .Build();
使用Cron表达式,一般实际项目中使用的是WithCronSchedule,因为Cron表达式更加灵活、方便。
本实列使用抽象工厂设计模式。Quartz的版本为3.0.7.0。
一、创建调度器添加JOB的接口
- namespace QuartzNet.Interface
- {
- interface ISchedulerAddJob
- {
- //尽量保证job、group、trigger、order_no的唯一性,避免冲突
- void SchedulerAddJob();
- }
- }
二、实现IJob接口,指定执行的作业
- using BLL;
- using Quartz;
- using System.Threading.Tasks;
-
- namespace QuartzNet.ExecuteJobWaysImpl
- {
- public class ExecuteSyncInTime : IJob
- {
- public Task Execute(IJobExecutionContext context)
- {
- return Task.Run(() =>
- {
- //调用无返回值的方法
- new Class1().SyncInTime();
- });
- }
- }
- }
三、实现ISchedulerAddJob接口
- using Quartz;
- using QuartzNet.ExecuteJobWaysImpl;
- using QuartzNet.Interface;
- using System;
-
- namespace QuartzNet.SchedulerImpl
- {
- public class SyncInTimeImpl : ISchedulerAddJob
- {
- IScheduler scheduler;
-
- //1、构造器注入调度器
- public SyncInTimeImpl(IScheduler scheduler)
- {
- this.scheduler = scheduler;
- }
-
- public async void SchedulerAddJob()
- {
- //2、创建一个任务
- IJobDetail job = JobBuilder.Create<ExecuteSyncInTime>().WithIdentity("job3", "group3").Build();
-
- //3、创建一个WithSimpleSchedule触发器
- ITrigger simpleTrigger = TriggerBuilder.Create()
- .WithIdentity("trigger3", "group3")
- .WithSimpleSchedule(x => x.WithIntervalInHours(Properties.Settings.Default.JOB3_RUNTIME)
- .RepeatForever()
- )
- .UsingJobData("order_no3", Guid.NewGuid().ToString())//作业数据传递
- .Build();
-
- //4、将任务与触发器添加到调度器中
- await scheduler.ScheduleJob(job, simpleTrigger);
- }
- }
- }
四、创建一个调度工厂,用于创建调度器,确保唯一实例
- using Quartz;
- using Quartz.Impl;
- using System.Threading.Tasks;
-
- namespace QuartzNet
- {
- public class QuartzManage
- {
- //创建一个调度工厂
- public static Task
scheduler = GetScheduler(); -
- private async static Task
GetScheduler() - {
- StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
- IScheduler scheduler = await stdSchedulerFactory.GetScheduler();
- return scheduler;
- }
- }
- }
五、调用SchedulerAddJob方法,创建任务和触发器,并添加到调度器中,可批量调用
- public partial class QuartzForm : Form
- {
- //向上转型,里氏替换原则
- private static ISchedulerAddJob schedulerAddJob;
- private static IScheduler scheduler;
-
- public QuartzForm ()
- {
- InitializeComponent();
- }
-
- private async void btnStart_Click(object sender, EventArgs e)
- {
- //唯一调度器
- scheduler = await QuartzManage.scheduler;
-
- schedulerAddJob = new SyncInTimeImpl(scheduler);
- schedulerAddJob.SchedulerAddJob();
-
- //开始执行
- await scheduler.Start();
- }
- }
六、关闭、暂停和恢复JOB的方法
- //在应用程序关闭时运行的代码
- if (scheduler != null)
- {
- await scheduler.Shutdown(true);
- }
-
- //暂停所有job
- await scheduler.PauseAll();
-
- //恢复所有job
- await scheduler.ResumeAll();