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/(待学习)

原文地址:https://www.cnblogs.com/fanfan-90/p/13647524.html