Quartz.net笔记
Quartz.net:
定时执行框架,几乎可以执行所有触发器类型的定时任务,非常灵活。
基本概念:
IScheduler:任务调度器,相当于一个大的容器。调度器通常在应用程序启动时创建,一个应用程序实例通常只需要一个调度器即可。
IJob:工作
Trigger:触发器,job和trigger的关系是一对多
trigger有N多种,如:CronScheduleBuilder(Cron模式)、CalendarIntervalScheduleBuilder(定时模式)、SimpleScheduleBuilder...
如果需要执行多个定时任务:IScheduler只需要创建一次,trgger、job需要创建多个,名称不要重复
触发器:
- 任务和触发器是一对多关系, 同一个任务可以绑定到多个触发器中,但是一个触发器只能绑定一个任务
- 触发器可以在某天特定时间触发
- 触发器可以在一周某一天触发(周一-周日)
- 触发器可以在一个月中某一天触发
- 触发器可以在一年某一天触发
- 触发器支持排除日期列表
- 触发器支持指定次数的重复触发
- 触发器支持无限次数的重复触发
- 触发器支持直到某个时间/日期重复触发
- 触发器支持一定时间间隔的重复触发
要执行一个定时任务,一般需要以下几步:
- 创建实现IJob接口的Job,Job是作业的类型,描述了作业是如何执行的,这个类是由我们定义的;
- 创建任务调度器。调度器通常在应用程序启动时创建,一个应用程序实例通常只需要一个调度器即可。
- 创建JobDetail。JobDetail是Quartz对作业的封装,它包含Job类型,以及Job在执行时用到的数据,还包括是否要持久化、是否覆盖已存在的作业等选项。
- 创建触发器。触发器描述了在何时执行作业。
- 添加调度。当完成以上三步以后,就可以对作业进行调度了。
Demo:
启动时初始化一次即可
IScheduler scheduler = new StdSchedulerFactory().GetScheduler();
JobDetailImpl job = new JobDetailImpl("jdTest", typeof(EmailJob));
//IMutableTrigger trigger = CronScheduleBuilder.DailyAtHourAndMinute(13, 32).Build();//每天13:40执行一次
//CronScheduleBuilder.MonthlyOnDayAndHourAndMinute//每月哪天几点几分执行
//CronScheduleBuilder.WeeklyOnDayAndHourAndMinute//每周固定时间执行
//CronScheduleBuilder.AtHourAndMinuteOnGivenDaysOfWeek//每周几,几点几分执行
CalendarIntervalScheduleBuilder builder = CalendarIntervalScheduleBuilder.Create();
builder.WithInterval(3,IntervalUnit.Second);//每3秒执行一次
IMutableTrigger trigger = builder.Build();
//开始执行
trigger.Key = new TriggerKey("triggerTest");
scheduler.ScheduleJob(job, trigger);
scheduler.Start();
Job:
public class EmailJob : IJob
{
//IJobExecutionContext 包含了与当前上下文中关联的Scheduler、JobDetail、Trigger等
public void Execute(IJobExecutionContext context)
{
System.Console.WriteLine("execute lala ~~");
}
}
Quartz.Net整合Autofac:
-
引用Nuget包:Autofac.Extras.Quartz
-
注入服务:
containerBuilder.RegisterModule(new QuartzAutofacFactoryModule());
containerBuilder.RegisterModule(new QuartzAutofacJobsModule(typeof(SurffixConsumerJob).Assembly));//Job所在的项目 -
将上个Demo中的代码替换:
IScheduler scheduler = new StdSchedulerFactory().GetScheduler().Result;
替换为:
IScheduler scheduler = this._serviceLocator.Resolve<IScheduler>();//框架帮我们创建了IScheduler,不需要自己创建,如果使用自己创建的IScheduler会导致Job注入失败
- Job构造函数中注入服务:
public class SurffixConsumerJob : IJob
{
private ILifetimeScope _serviceLocator = null;
private RabbitAdvancedBus _bus = null;
public SurffixConsumerJob(ILifetimeScope serviceLocator, RabbitHutch hutch)
{
this._serviceLocator = serviceLocator;
this._bus = hutch.RabbitAdvancedBus;
}
//IJobExecutionContext 包含了与当前上下文中关联的Scheduler、JobDetail、Trigger等
Task IJob.Execute(IJobExecutionContext context)
{
}
}
参考:
https://www.cnblogs.com/lwqlun/p/9095106.html
https://www.cnblogs.com/hzz521/tag/Quartz.NET/(待学习)