根据官网说明

类型 概述
IScheduler 调度类核心接口
IJob 独立实现业务逻辑需要继承的任务接口
IJobDetail 给任务接口定义实例的任务说明类接口
ITrigger 触发器,设置何时出发,周期触发等
JobBuilder 用于创建IJobDetail类,参数为IJob
TriggerBuilder 创建触发器
SchedulerBuilder 调度任务的配置类,可实例出调度类Quartz 3.1版本及以后有效

Jobs 和 Trigger

Job

只需要继承IJob,并实现Task Execute即可

在调度器线程中通过任务的触发器去执行Execute方法,JobExecutionContext通过任务方法传入的调度器的环境信息和执行信息,还有一部分IJObDetail的相关信息。IJobDetail是任务添加在调度中的类,他包含了任务设置,都保存在JobDataMap类中。JobDataMap中存储了任务的相关信息和在创建时设置的相关信息。

  • JobDetail 可以通过JobBuilder进行创建

    IJobDetail job = JobBuilder.Create<HelloJob>()
    .WithIdentity("myJob", "group1")
    .Build();
  • JobDataMap - IDictionary的实现类

    • 获得JobDataMap中的信息
    // 创建IJobDetail时将需要添加的信息存储起来
    IJobDetail job = JobBuilder.Create<DumbJob>()
    .WithIdentity("myJob", "group1") // name "myJob", group "group1"
    // 存储到了JobDataMap中
    .UsingJobData("jobSays", "Hello World!")
    .UsingJobData("myFloatValue", 3.141f)
    .Build();
    // DumbJob类中使用存储的数据
    public class DumbJob : IJob
    {
    public async Task Execute(IJobExecutionContext context)
    {
    JobKey key = context.JobDetail.Key;
    // 调用 context.MergedJobDataMap获得字典实例
    JobDataMap dataMap = context.JobDetail.JobDataMap;
    string jobSays = dataMap.GetString("jobSays");
    float myFloatValue = dataMap.GetFloat("myFloatValue");
    }
    }
    • 使用JobStore存储数据
    JobDataMap dataMap = context.JobDetail.JobDataMap;
    dataMap.add("name1", "value1");
    • 标签

      DisallowConcurrentExecution 不允许并发任务

      PersistJobDataAfterExecution 执行后保存数据

    • IJobDetail方法说明

      WithIdentity 唯一标识,包含名称和群组
      WithDescription 任务描述
      StoreDurably 是否持久化,否:触发器一旦停止则任务会删除
      RequestRecovery 请求恢复,当程序意外终止并启动后,任务会重新执行
    • JobExecutionException IJob.Execute()抛出的异常

Trigger

触发器主要用于对于调度任务的触发,主要分为ISimpleTrigger和ICronTrigger

触发器也可以有JobDataMap类

StartTimeUtc : 执行时间

EndTimeUtc :结束时间

priority :触发器优先级(默认为5,越大优先级越高)

MisfireInstruction :只读,未执行指令,表示因为特殊原因应该执行而未执行的作业

Calendar :日历设置,用于排除执行范围中的特定日期

// 日历起名
const string calendarName = "myHolidayCalendar";
// 第一种写法
q.AddCalendar<HolidayCalendar>(
name: calendarName,
replace: true,
updateTriggers: true,
// 排除的日期
x => x.AddExcludedDate(new DateTime(2023, 1, 29))
);
q.AddTrigger(t => t
.WithIdentity("Daily Trigger")
.ForJob(jobKey)
.StartAt(DateBuilder.EvenSecondDate(DateTimeOffset.UtcNow.AddSeconds(5)))
.WithDailyTimeIntervalSchedule(x => x.WithInterval(10, IntervalUnit.Second))
.WithDescription("my awesome daily time interval trigger")
// 排除的日期名称
.ModifiedByCalendar(calendarName)
);
// 第二种写法
HolidayCalendar cal = new HolidayCalendar();
// 排除的日期列表
cal.AddExcludedDate(new DateTime(2023, 1, 29));
await sched.AddCalendar(calendarName, cal, false);
ITrigger t = TriggerBuilder.Create()
.WithIdentity("myTrigger")
.ForJob("myJob")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(9, 30))
// 排除的日期名称
.ModifiedByCalendar("myHolidays") // but not on holidays
.Build();
  • SimpleTrigger

    1. SimpleTrigger执行周期设置

    只执行一次或者按照时间执行多次

    ISimpleTrigger example = (ISimpleTrigger)TriggerBuilder.Create()
    // 唯一主键并放在trigger-group群组中
    .WithIdentity("trigger-name", "trigger-group")
    // 执行的任务是job-group群组的job-name任务
    .ForJob("job-name", "job-group")
    // 执行方式(触发器内容设置)
    .WithSimpleSchedule(o =>
    {
    // 每个五分钟执行一次,一共执行5次
    o.WithRepeatCount(5)
    .WithInterval(TimeSpan.FromMinutes(5));
    })
    .Build();
    • 某个时间点执行

      // startTime 时开始执行
      .StartAt(startTime)
    • 重复执行

      .WithSimpleSchedule(x => x
      // 每10s执行一次
      .WithIntervalInSeconds(10)
      // 循环10次,因此一共执行11次
      .WithRepeatCount(10))
    • 延迟执行

      // 5分钟后执行
      .StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute))
    • 循环执行,直到某个时间点

      .WithSimpleSchedule(x => x
      // 每5分钟执行一次
      .WithIntervalInMinutes(5)
      // 重复执行
      .RepeatForever())
      // 22:00:00结束
      .EndAt(DateBuilder.DateOf(22, 0, 0))
    • 从下一个小时开始重复执行

      // 从下一个小时开始
      .StartAt(DateBuilder.EvenHourDate(null))
      // 每两个小时重复执行一次
      .WithSimpleSchedule(x => x
      .WithIntervalInHours(2)
      .RepeatForever())
    1. SimpleTrigger方法说明

      var trigger = TriggerBuilder.Create()
      .WithIdentity("trigger1", "group1")
      .StartAt(runTime)
      .WithSimpleSchedule(x=>x
      .WithIntervalInMinutes(5)
      .RepeatForever()
      // 未执行策略(失火策略)有效
      .WithMisfireHandlingInstructionFireNow()
      // 重启计划并重新计算剩余的计划数
      .WithMisfireHandlingInstructionNowWithRemainingCount()
      // 计算剩余的计划数
      .WithMisfireHandlingInstructionNextWithRemainingCount()
      // 忽略未执行策略(失火策略)MisfireInstruction失效
      .WithMisfireHandlingInstructionIgnoreMisfires()
      // 立即重新计算
      .WithMisfireHandlingInstructionNowWithExistingCount()
      // 重新计划下一个
      .WithMisfireHandlingInstructionNextWithExistingCount())
      .Build();
  • CronTrigger

    var example = TriggerBuilder.Create()
    .WithIdentity("trigger-name", "trigger-group")
    .ForJob("job-name", "job-group")
    // 秒 分 时 日 月 年
    // 每年的6月份每天的每个小时的23分45秒都执行一次
    .WithCronSchedule("45 23 * * 6 ?") //官网给出的45 23 * * 6 貌似不对
    .Build();
    1. cron参数

      • cron赋值

        .WithCronSchedule("0 0/2 8-17 * * ?")
      • 代码自带的cron赋值

        // 方法1
        .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(10, 42))
        // 方法2
        .WithCronSchedule("0 42 10 * * ?")
      • 使用其他时区的时间定时

        .WithSchedule(CronScheduleBuilder
        .WeeklyOnDayAndHourAndMinute(DayOfWeek.Wednesday, 10, 42)
        //设置时区
        .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Tcime")))
    2. CronTrigger特有方法

      ITrigger trigger = TriggerBuilder.Create()
      .WithIdentity("trigger3", "group1")
      .WithCronSchedule("0 0/2 8-17 * * ?", x => x
      // 忽略未执行策略
      .WithMisfireHandlingInstructionIgnoreMisfires()
      // 策略未执行时什么也不干
      .WithMisfireHandlingInstructionDoNothing()
      // 启用未执行策略
      .WithMisfireHandlingInstructionFireAndProceed())
      .ForJob("myJob", "group1")
      .Build();

Quartz.Net 官方教程 Tutorial 1/3(Jobs 和 Trigger)的更多相关文章

  1. Quartz.net官方开发指南系列篇

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...

  2. Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译

    本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  3. Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译

    本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  4. Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译

    本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...

  5. [爬虫] 学Scrapy,顺便把它的官方教程给爬下来

    想学爬虫主要是因为算法和数据是密切相关的,有数据之后可以玩更多有意思的事情,数据量大可以挖掘挖掘到更多的信息. 之前只会通过python中的request库来下载网页内容,再用BeautifulSou ...

  6. Quartz教程二:API,Job和Trigger

    原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...

  7. Note | PyTorch官方教程学习笔记

    目录 1. 快速入门PYTORCH 1.1. 什么是PyTorch 1.1.1. 基础概念 1.1.2. 与NumPy之间的桥梁 1.2. Autograd: Automatic Differenti ...

  8. Unity性能优化(1)-官方教程The Profiler window翻译

    本文是Unity官方教程,性能优化系列的第一篇<The Profiler window>的简单翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻 ...

  9. jeecg表单页面控件权限设置(请先看官方教程,如果能看懂就不用看这里了)

    只是把看了官方教程后,觉得不清楚地方补充说明一下: 1. 2. 3. 4.用"jeecgDemoController.do?addorupdate"这个路径测试,不出意外现在应该可 ...

  10. [转]Google Guava官方教程(中文版)

    Google Guava官方教程(中文版) http://ifeve.com/google-guava/

随机推荐

  1. R数据分析:扫盲贴,什么是多重插补

    好多同学跑来问,用spss的时候使用多重插补的数据集,怎么选怎么用?是不是简单的选一个做分析?今天写写这个问题. 什么时候用多重插补 首先回顾下三种缺失机制或者叫缺失类型: 上面的内容之前写过,这儿就 ...

  2. 2流高手速成记(之七):基于Dubbo&Nacos的微服务简要实现

    本节内容会用到之前给大家讲过的这两篇: 2流高手速成记(之六):从SpringBoot到SpringCloudAlibaba 2流高手速成记(之三):SpringBoot整合mybatis/mybat ...

  3. CSP-S游记

    第三次考csp-s了,希望这次不要二等 Day ?(初赛) 之前校内模拟赛平均下来都在班级中游,所以不求高分但是觉得过没问题(事实好像确实如此 先开题,选择题很水秒了(devinNB猜到了考Linux ...

  4. CB利用链及无依赖打Shiro

    前言 前面已经学习了CC1到CC7的利用链,其中在CC2中认识了java.util.PriorityQueue ,它在Java中是一个优先队列,队列中每一个元素有自己的优先级.在反序列化这个对象时,为 ...

  5. 领域驱动设计(DDD)在美团点评业务系统的实践

    前言 至少 30 年以前,一些软件设计人员就已经意识到领域建模和设计的重要性,并形成一种思潮,Eric Evans 将其定义为领域驱动设计(Domain-Driven Design,简称 DDD).在 ...

  6. uwsgi 启动配置文件

    # uwsig使用配置文件启动 [uwsgi] # 项目目录 chdir=/myfiles/xxx/xxx/my_project # 指定项目的application module=my_projec ...

  7. xshell登陆,查看中文日志出现乱码

    看到乱码,首先想到的是编码问题 linux默认编码格式是utf-8,windows默认gbk [root@backup]# echo $LANGen.US.UTF-8 使用fie命令可以查看到文件信息 ...

  8. 【云原生 · DevOps】DevOps 解决方案

    DevOps 解决方案 1.1 容器化 CI/CD 1.2 容器化流水线 1.3 深度集成 Jenkins 1.4 灰度发布 1.5 制品库设计 1.6 DevOps 安全 1.6.1 CI/CD 安 ...

  9. 浅谈 Java 和 Python 的反射

    反射这个词我一直没搞懂,也不知道为什么需要反射,也不知道反射到底做了什么.所见所闻逐渐丰富之后,开始有点儿懂了. 先不管反射这个词是什么意思.Java 里面有反射,Python 里面也有反射,但是不太 ...

  10. socet网络编程

    一. 网络模型 应用层   -----     HTTP协议 传输层   -----     TCP协议 网络层   -----       IP协议 链路层   -----     以太网协议 二. ...