Quartz.Net 官方教程 Tutorial 1/3(Jobs 和 Trigger)
根据官网说明
类型 | 概述 |
---|---|
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
- 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())
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();
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")))
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)的更多相关文章
- Quartz.net官方开发指南系列篇
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...
- Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译
本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译
本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...
- [爬虫] 学Scrapy,顺便把它的官方教程给爬下来
想学爬虫主要是因为算法和数据是密切相关的,有数据之后可以玩更多有意思的事情,数据量大可以挖掘挖掘到更多的信息. 之前只会通过python中的request库来下载网页内容,再用BeautifulSou ...
- Quartz教程二:API,Job和Trigger
原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...
- Note | PyTorch官方教程学习笔记
目录 1. 快速入门PYTORCH 1.1. 什么是PyTorch 1.1.1. 基础概念 1.1.2. 与NumPy之间的桥梁 1.2. Autograd: Automatic Differenti ...
- Unity性能优化(1)-官方教程The Profiler window翻译
本文是Unity官方教程,性能优化系列的第一篇<The Profiler window>的简单翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻 ...
- jeecg表单页面控件权限设置(请先看官方教程,如果能看懂就不用看这里了)
只是把看了官方教程后,觉得不清楚地方补充说明一下: 1. 2. 3. 4.用"jeecgDemoController.do?addorupdate"这个路径测试,不出意外现在应该可 ...
- [转]Google Guava官方教程(中文版)
Google Guava官方教程(中文版) http://ifeve.com/google-guava/
随机推荐
- Python基础之函数:4、二分法、三元表达式、生成/推导式、匿名函数、内置函数
目录 一.算法简介之二分法 1.什么是算法 2.算法的应用场景 3.二分法 二.三元表达式 1.简介及用法 三.各种生成式 1.列表生成式 2.字典生成式 3.集合生成式 四.匿名函数 五.常见内置函 ...
- 缺省源&一些常用的码头
#include <bits/stdc++.h> #define N 1000010 #define M 2000010 #define pii pair<int,int> # ...
- 树上启发式合并(dsu on tree)
树上启发式合并属于暴力的优化,复杂度O(nlogn) 主要解决的问题特点在于: 1.对于树上的某些信息进行查询 2.一般问题的解决不包含对树的修改,所有答案可以离线解决 算法思路:这类问题的特点在于父 ...
- 基于Spring的发布订阅模式 EventListener
基于Spring的发布订阅模式 在我们使用spring开发应用时,经常会碰到要去解耦合一些依赖调用,比如我们在做代码的发布流程中,需要去通知相关的测试,开发人员关注发布中的错误信息.而且通知这个操作又 ...
- 系统启动后bond配置不生效问题定位
背景描述 为了适配新功能,裸金属服务的磁盘镜像中做了如下修改: dracut添加network, iscsi模块 grub添加rd.iscsi.firmware=1参数 删除网卡配置文件/etc/sy ...
- 【云原生 · Kubernetes】kubernetes v1.23.3 二进制部署(一)
kubernetes v1.23.3 二进制部署 1. 组件版本和配置策略 1.1 主要组件版本 1.2 主要配置策略 2. 初始化系统和全局变量 2.1 集群规划 2.2 kubelet cri-o ...
- JqGrid 编辑单元格内容时提示url未设定错误 2018-08-06
感谢大佬的资料https://blog.csdn.net/Easy_____/article/details/30218421 虽然没实例,但也给了一些信息.我以为cellsubmit属性是添加到co ...
- Linux 基础-查看 cpu、内存和环境等信息
Linux 基础-查看 cpu.内存和环境等信息 在使用 Linux 系统的过程中,我们经常需要查看系统.资源.网络.进程.用户等方面的信息,查看这些信息的常用命令值得了解和熟悉. 1,系统信息查看常 ...
- 在Java Web中setContentType与setCharacterEncoding中设置字符编码格式的区别
在Java Web中setContentType与setCharacterEncoding中设置字符编码格式的区别 通用解释 setCharacterEncoding只是设置字符的编码方式 setCo ...
- tesseract-orc训练 结合python3图像识别验证码
##前言 其实就是用到tesseract-ocr这个引擎来识别,只不过我们需要做一些在此之前的工作 将图片用pillow进行初步处理,将图片中的验证码显示的清晰一些,关于这些教程可以查看我的另一篇文章 ...