Quartz.Net系列(十六):Misfire策略在SimpleScheduler和CronScheduler中的使用
1.场景
①因为工作线程都在忙碌,所以导致某些Trigger得不到触发
也就是默认10个工作线程而我有15个Trigger同时触发
这就导致有5个不能被触发,而不幸的是Trigger所关联的Job执行时间特别长
如果某些Trigger超过指定的阈值那么就不会触发
②Scheduler挂掉了。。。某些时刻又恢复了
③如果你设置的时间早于现在,中有一个StartAt
2.阈值是多少
RAMJobStore默认是5s,DBJobStore是60s
为了统一阈值,在初始化的时候,会读取内置的quartz.config文件,统一设置成60s
private TimeSpan misfireThreshold = TimeSpan.FromSeconds();
quartz.jobStore.misfireThreshold =
3.Misfire的策略
①错过几次让它立刻执行,后面正常调度
②错过的几次让他合并成一次执行,后面正常调度
③忽略错误的次数,正常调度

4.SimpleScheduler怎么使用Mrsfire策略
one
IScheduler scheduler=await SchedulerBuilder.Create().Build();
await scheduler.Start();
var job = JobBuilder.Create<MyJob>().Build();
var trigger = TriggerBuilder.Create()
.StartAt(DateBuilder.DateOf(,,))
.WithSimpleSchedule(s=>
s.WithIntervalInSeconds()
//.WithMisfireHandlingInstructionFireNow()
)
.Build();
await scheduler.ScheduleJob(job,trigger);
repeat count
IScheduler scheduler=await SchedulerBuilder.Create().Build();
await scheduler.Start();
var job = JobBuilder.Create<MyJob>().Build();
var trigger = TriggerBuilder.Create()
.StartAt(DateBuilder.DateOf(,,))
.WithSimpleSchedule(s=>
s.WithIntervalInHours()
//.WithMisfireHandlingInstructionFireNow()
.WithRepeatCount()
.WithMisfireHandlingInstructionIgnoreMisfires()
)
.Build();
await scheduler.ScheduleJob(job,trigger);

①WithMisfireHandlingInstructionNextWithExistingCount
比如说StartTime:7:00,每小时执行一次,现在时间是10:40也就是错过了4次 ,本来是11次 7+11=18点结束
也就是下次触发的时间 StartTime:22:00开始 重复执行11次 11+11=22点结束
也就是说任然会保留11次执行
IScheduler scheduler=await SchedulerBuilder.Create().Build();
await scheduler.Start();
var job = JobBuilder.Create<MyJob>().Build();
var trigger = TriggerBuilder.Create()
.StartAt(DateBuilder.DateOf(,,))
.WithSimpleSchedule(s=>
s.WithIntervalInHours()
//.WithMisfireHandlingInstructionFireNow()
.WithRepeatCount()
.WithMisfireHandlingInstructionNextWithExistingCount()
)
.Build();
await scheduler.ScheduleJob(job,trigger);
②WithMisfireHandlingInstructionNextWithRemainingCount
比如说StartTime:7:00,每小时执行一次,现在时间是10:40也就是错过了4次 ,本来是11次 7+11=18点结束
也就是下次触发的时间 StartTime:22:00开始 重复执行11-4次 ,不管错过的4次,正常调度,7+11=18点结束
IScheduler scheduler=await SchedulerBuilder.Create().Build();
await scheduler.Start();
var job = JobBuilder.Create<MyJob>().Build();
var trigger = TriggerBuilder.Create()
.StartAt(DateBuilder.DateOf(,,))
.WithSimpleSchedule(s=>
s.WithIntervalInHours()
//.WithMisfireHandlingInstructionFireNow()
.WithRepeatCount()
.WithMisfireHandlingInstructionNextWithRemainingCount()
)
.Build();
await scheduler.ScheduleJob(job,trigger);
③WithMisfireHandlingInstructionNowWithExistingCount
比如说StartTime:7:00,每小时执行一次,现在时间是10:40也就是错过了4次 ,本来是11次 7+11=18点结束
也就是下次触发的时间 StartTime=Now开始 重复执行11次 10.40+11=21.40结束
也就是说任然会保留11次执行,但是会从现在开始
IScheduler scheduler=await SchedulerBuilder.Create().Build();
await scheduler.Start();
var job = JobBuilder.Create<MyJob>().Build();
var trigger = TriggerBuilder.Create()
.StartAt(DateBuilder.DateOf(,,))
.WithSimpleSchedule(s=>
s.WithIntervalInHours()
//.WithMisfireHandlingInstructionFireNow()
.WithRepeatCount()
.WithMisfireHandlingInstructionNowWithExistingCount()
)
.Build();
await scheduler.ScheduleJob(job,trigger);

④WithMisfireHandlingInstructionNowWithRemainingCount
比如说StartTime:7:00,每小时执行一次,现在时间是10:40也就是错过了4次 ,本来是11次 7+11=18点结束
也就是下次触发的时间 StartTime=Now开始 重复执行11-4次 ,不管错过的4次,正常调度,7+10:40=17:40点结束
IScheduler scheduler=await SchedulerBuilder.Create().Build();
await scheduler.Start();
var job = JobBuilder.Create<MyJob>().Build();
var trigger = TriggerBuilder.Create()
.StartAt(DateBuilder.DateOf(,,))
.WithSimpleSchedule(s=>
s.WithIntervalInHours()
//.WithMisfireHandlingInstructionFireNow()
.WithRepeatCount()
.WithMisfireHandlingInstructionNowWithRemainingCount()
)
.Build();
await scheduler.ScheduleJob(job,trigger);

5.Cronscheduler如何使用Misfire策略
①WithMisfireHandlingInstructionFireAndProceed
错过的合并成一次执行,不修改调度时间
也就说假如StartTime=10:00 现在时间13:16 那么将合并成一次执行
var trigger = TriggerBuilder.Create()
.StartAt(DateBuilder.DateOf(, , ))
.WithCronSchedule("0 0 9-18 ? * MON-FRI",
x=>x.WithMisfireHandlingInstructionFireAndProceed()
)
.Build();

②WithMisfireHandlingInstructionIgnoreMisfires
错过的立即追赶,然后正常调度
var trigger = TriggerBuilder.Create()
.StartAt(DateBuilder.DateOf(, , ))
.WithCronSchedule("0 0 9-18 ? * MON-FRI",
x=>x.WithMisfireHandlingInstructionIgnoreMisfires()
)
.Build();

③WithMisfireHandlingInstructionDoNothing
错过的不管,正常执行
var trigger = TriggerBuilder.Create()
.StartAt(DateBuilder.DateOf(, , ))
.WithCronSchedule("0 0 9-18 ? * MON-FRI",
x=>x.WithMisfireHandlingInstructionDoNothing()
)
.Build();
Quartz.Net系列(十六):Misfire策略在SimpleScheduler和CronScheduler中的使用的更多相关文章
- S3C2416裸机开发系列十六_sd卡驱动实现
S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子 1048272975 SD卡(Secure Digital Memory Card)具有体积小.容量大.传输数据快.可插拔.安全性好等长 ...
- “全栈2019”Java第十六章:下划线在数字中的意义
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 学习ASP.NET Core Razor 编程系列十六——排序
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 为什么不让用join?《死磕MySQL系列 十六》
大家好,我是咔咔 不期速成,日拱一卒 在平时开发工作中join的使用频率是非常高的,很多SQL优化博文也让把子查询改为join从而提升性能,但部分公司的DBA又不让用,那么使用join到底有什么问题呢 ...
- 【Android Studio安装部署系列】三十六、Android studio3.2使用过程中注意事项
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio升级到3.2之后,运行旧项目的时候出现了各种情况,特此记录下. 一.打包选项多了,一般情况下选择APK即 ...
- ES系列十六、集群配置和维护管理
一.修改配置文件 1.节点配置 1.vim elasticsearch.yml # ======================== Elasticsearch Configuration ===== ...
- arcgis api for js入门开发系列十六迁徙流动图
最近公司有个arcgis api for js的项目,需要用到百度echarts迁徙图效果,而百度那个效果实现是结合百度地图的,怎么才能跟arcgis api结合呢,网上搜索,终于在github找到了 ...
- arcgis api 3.x for js 入门开发系列十六迁徙流动图
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- Ansible 小手册系列 十六(Playbook Debug)
debug模块在执行期间打印语句,并且可用于调试变量或表达式,而不必停止playbook. 打印自定义的信息 - debug: msg="System {{ inventory_hostna ...
随机推荐
- 果然学习好是有道理的,学习Mysql与正则表达式笔记
正则表达式是用来匹配文本的特殊的字符集合,将一个正则表达式与文本串进行比较,Mysql中用where子句提供支持,正则表达式关键字:regexp1.使用‘|’匹配两个串中的一个 2.使用‘[]’匹配几 ...
- .Net微服务实战之DevOps篇
技术只是基础 该系列的两篇文章<.Net微服务实战之技术选型篇>和<.Net微服务实战之技术架构分层篇>都是以技术角度出发描述微服务架构的实施. 如果技术选型篇叙述的是工具,那 ...
- Docker中使用RabbitMQ
安装Docker yum install docker //安装完成以后,可以查看一下docker的版本 docker -v //Docker version 1.13.1, build 64e998 ...
- elk4
传统问题: 微服务系统下服务器数量过大,如果还在使用依次登录每台机器的传统方法查询日志,这样效率非常低下.ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案,是三个产品的首字母缩写 ...
- disruptor架构三 使用场景更加复杂的场景
先c1和c2并行消费生产者产生的数据,然后c3再消费该数据 我们来使用代码实现:我们可以使用Disruptor实例来实现,也可以不用产生Disruptor实例,直接调用RingBuffer的api来实 ...
- MongoDB快速入门教程 (1)
1.MongoDB初识 1.1.MongoDB是什么? MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于 ...
- ASP.NET MVC 下拉框的传值的两种方式(第二种方式未完成)
控制器代码: public ActionResult Index() { List<SelectListItem> sli = new List<SelectListItem> ...
- Java 从入门到进阶之路(二十六)
在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 的子接口 List,本章我们来看一下 Java 集合框架中的Collection 的子接口 Queue. 在之前我们讲 ...
- python三大神器之fabric
Fabric Fabric是一个python的远程执行shell的库,同时它也是一个命令行工具.它提供了丰富的同 SSH 交互的接口,可以用来在本地或远程机器上自动化.流水化地执行 Shell 命令. ...
- win中mysql安装
mysql安装: https://www.mysql.com/>官网 下载 [DOWNLOADS]----[MySQL Community Server]社区版---5.6---No thank ...