第七节:Trigger(SimpleTrigger、CronTrigger)哑火(MisFire)策略 :

一. 简介

1. 什么是哑火

  由于某些原因导致触发器(trigger)在该触发的时候没有得到触发,后续对应的解决策略即为哑火策略。(个人理解)

2. 哑火触发的条件

  ①:所有的工作线程都在忙碌,导致某些trigger得不到触发.(如:simplethreadpool 默认是10个工作线程,但我有15个trigger同时触发, 恰巧这10个trigger关联的job耗时都很长,剩下的5个trigger超过了等待时间仍然没有得到触发)

  ②:调度器(sheduler)中途挂了,某个时间又恢复了

  ③:设置的trigger的开始时间早于当前时间

 如果没有触发哑火的条件,则不会触发哑火策略,之前的全部都是按照忽略来计算的,后续按照正常规律来进行。如果不设置开始时间,即为当前时间开始,不触发哑火策略。

 下面介绍两类Trigger对应的哑火策略:SimpleTrigger和CronTrigger (前提:案例设置时间早于当前时间的,即都是有错过的)

 

二. SimpleTrigger哑火策略详解

   这里要分三种情况来讨论,执行指定次数的情况WithRepeatCount(n),n=1、n>1、n=forever三种情况,重点理解n>1的情况,另外两种都是他的特殊情况而已。

(一):执行指定次数的情况(WithRepeatCount(n) n>1) 只要记住这种情况,下面的B和C都能分析出来

(1).默认 :立即执行,修改当前调度时间,总数保持不变 (等价于WithMisfireHandlingInstructionNowWithExistingCount)

  详见下面解析

(2).WithMisfireHandlingInstructionIgnoreMisfires:错过的立即追赶,然后正常调度。

  PS:设置的时间早于当前时间,执行的时候,会将当前时间之前错过的次数一次性执行完,然后正常按照设置的开始时间及规律进行执行。 如果设置的RepeatCount(n)中n的次数小于错过的次数,只能执行n次,执行完后,将不会在执行了,因为执行次数已经用完了。

  案例:设置的开始时间为8:00,每隔半小时执行一次,执行总次数为5次,当前时间为9:05,那么开始时候会先执行3次,将错过的一次性执行了,然后按照正常调度执行,下一次执行的时间为9:30,还能执行两次。

(3).WithMisfireHandlingInstructionNextWithExistingCount:错过的不管了,按计划等待下次调度,总数不变,结束时间推迟。
  PS:错过的次数不处理,仍按照设置的规律来执行,执行次数不变,要执行完的RepeatCount(n)中的n.

  案例:设置的开始时间为8:00,每隔半小时执行一次,执行总次数为5次,当前时间为9:05,那么开始时候并没有调度执行,第一次执行调度的时间为9:30,然后按照正常调度执行,总共执行5次,最后一次时间为11:30。

(4).WithMisfireHandlingInstructionNextWithRemainingCount:错过的不管了,按计划等待下次调度,但总数要减去misfire错过的次数
  PS:错过的次数不处理,仍按照设置的规律来执行,执行总数要 减去 错过的次数!

    案例:设置的开始时间为8:00,每隔半小时执行一次,执行总次数为5次,当前时间为9:05,那么开始时候并没有调度执行,第一次执行调度的时间为9:30,然后按照正常调度执行,总共执行      5-3=2 次,最后一次时间为10:00。

(5).WithMisfireHandlingInstructionNowWithExistingCount: 立即执行,修改当前调度时间,总数保持不变
  PS:立即执行,修改当前调度时间的含义为,即使我设置的开始时间早于当前时间,但该哑火策略会立马执行该触发器,即运行后,马上执行了一次,后续的时间间隔均是是以当前执行时间为基础来进行的,言外之意,之前设置的开始时间没用了,执行总数不变。

   案例:设置的开始时间为8:00,每隔半小时执行一次,执行总次数为5次,当前时间为9:05,那么开始时候立即执行,第一次执行调度的时间为9:05,然后以9:05为基础,按照正常调度规律执行,总共执行5次,第二次时间为9:35,最后一次执行时间为11:05。

(6).WithMisfireHandlingInstructionNowWithRemainingCount: 立即执行,修改当前调度时间,总数要减去misfire错过的次数
  PS:立即执行,修改当前调度时间的含义为,即使我设置的开始时间早于当前时间,但该哑火策略会立马执行该触发器,即运行后,马上执行了一次,后续的时间间隔均是是以当前执行时间为基础来进行的,言外之意,之前设置的开始时间没用了。执行总数要 减去 错过的次数!

  案例:设置的开始时间为8:00,每隔半小时执行一次,执行总次数为5次,当前时间为9:05,那么开始时候立即执行,第一次执行调度的时间为9:05,然后以9:05为基础,按照正常调度规律执行,总共执行 5-3=2 次,第二次(即最后一次)时间为9:35。

B:只执行一次的情况 (WithRepeatCount(n) n=1) 对A情况的一个特殊分析

(1). 默认:(等价于WithMisfireHandlingInstructionFireNow)

(2). WithMisfireHandlingInstructionFireNow:立即执行

  PS:设置的时间早于当前时间,执行的时候,立即把这一次执行完,后续将不再执行;但设置的时间晚于当前时间,则按照正常规律进行执行了

(3).WithMisfireHandlingInstructionNextWithRemainingCount 和 WithMisfireHandlingInstructionNowWithRemainingCount :不执行了

  PS:设置的时间早于当前时间,执行的时候按照原规律执行,但是次数要减去错过的次数,这里总共就执行一次,所以就不执行了

 

C:永久执行的情况(RepeatForever) 对A情况的一个特殊分析

(1). 默认:等价与下面的(2),按计划的正常调度执行,执行次数永久执行

(2). WithMisfireHandlingInstructionNextWithExistingCount 和 WithMisfireHandlingInstructionNextWithRemainingCount:按计划的正常调度执行,执行次数永久执行

(3). WithMisfireHandlingInstructionNowWithExistingCount 和 WithMisfireHandlingInstructionNowWithRemainingCount: 立即执行,执行的开始时间改为当前时间,执行次数永久执行

代码分享:自行替换即可

复制代码

 1         public static void misfireShow()2         {3             //1.创建Schedule4             IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();5             //2.创建job (具体的job需要单独在一个文件中执行)6             var job = JobBuilder.Create<HelloJob4>().Build();7             //3.配置trigger 8             //下面的四个触发器对应了上面四种情况的测试,时间需要根据实际情况进行配置测试来设置9             var trigger1 = TriggerBuilder.Create().StartAt(DateBuilder.DateOf(20, 0, 0))
10                          .WithSimpleSchedule(x => x.WithIntervalInMinutes(30)
11                                                    .WithRepeatCount(8)
12                                                   .WithMisfireHandlingInstructionNowWithExistingCount()
13                                              ).Build();
14             var trigger2 = TriggerBuilder.Create().StartAt(DateBuilder.DateOf(18, 0, 0))
15                              .WithSimpleSchedule(x => x.WithIntervalInSeconds(1)
16                                                        .WithRepeatCount(1)
17                                                       .WithMisfireHandlingInstructionFireNow()
18                                                  ).Build();
19             var trigger3 = TriggerBuilder.Create()
20                                         .StartAt(DateBuilder.DateOf(15, 0, 0, 5, 3, 2018))
21                                         .WithSimpleSchedule(x => x.WithIntervalInMinutes(1)
22                                                                  .WithMisfireHandlingInstructionNowWithRemainingCount()
23                                                                  .RepeatForever()).Build();
24             var trigger4 = TriggerBuilder.Create()
25                                       .StartAt(DateBuilder.DateOf(14, 0, 0))
26                                       .WithCronSchedule("0 0-59 9-23 ? * MON-FRI",x=>x.WithMisfireHandlingInstructionIgnoreMisfires()).Build();
27 
28             //4.开始调度
29             scheduler.ScheduleJob(job, trigger1);
30             scheduler.Start();
31         }

复制代码

 

三. CronTrigger哑火策略详解

(1). 默认:错过的合并,于当前时间执行一次,不修改调度时间,按计划等待下一次调度(等价于下面的 WithMisfireHandlingInstructionFireAndProceed)

(2). WithMisfireHandlingInstructionIgnoreMisfires:错过的立即追赶,然后正常调度

  ps:错过多少次,初次执行的时候追赶多少次,追赶的次数的时间是按原规律执行的时间,然后按照原规律进行正常后续调度

(3). WithMisfireHandlingInstructionFireAndProceed:错过的合并,于当前时间执行一次,不修改调度时间,按计划等待下一次调度

  PS:无论错过多少次,均在初次运行的时候,即当前时间执行一次,后续的执行仍按照原规律进行执行。

(4). WithMisfireHandlingInstructionDoNothing:错过的不管了,后续按照正常调度进行

  PS:无论错过多少次,均忽略,后续的执行仍按照原规律进行执行。

 代码详见上面的代码分享

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案

一. 简介 揭秘&#xff1a; SimpleThreadPool是Quartz.Net中自带的线程池&#xff0c;默认个数为10个&#xff0c;代表一个Scheduler同一时刻并发的最多只能执行10个job&#xff0c;超过10个的job需要排队等待。 二. 四种配置方案 1. NameValueCollection的方式 需要利用StdSch…

隐藏wp login.php,Wordpress 隐藏登陆链接

用过Wordpress做博客或者建站的朋友&#xff0c;都会知道Wordpress默认的登陆地址是wp-login.php&#xff0c;很多恶意程序就是通过爬这个地址&#xff0c;尝试使用常见的用户名密码组合来入侵Wordpress。尽管我们可以通过使用复杂的用户名、高强度的密码来防止恶意程序的猜测&…

第九节: 利用RemoteScheduler实现Sheduler的远程控制

一. RemoteScheduler远程控制 1. 背景&#xff1a; 在A服务器上部署了一个Scheduler&#xff0c;我们想在B服务器上控制这个Scheduler。 2. 猜想&#xff1a; A服务器上的Scheduler需要有地址、需要有端口、需要有名称(实际上也是如此)。 3. 需求&#xff1a; 一个控制台程序…

oracle扩容日志文件,调整Oracle Redo Logfile日志文件的大小

1、扩容lvlvextend -L 1G /dev/oravg/lv_redolog11lvextend -L 1G /dev/oravg/lv_redolog12lvextend -L 1G /dev/oravg/lv_redolog212、调整了一下大小&#xff0c;将每个日志文件调整为2Gselect * from v$logfile;查看属于哪个裸设备。group 1属于/dev/raw/raw10、group 2属于…

渗透技巧——利用netsh抓取连接文件服务器的NTLMv2 Hash

0x00 前言 在上篇文章《Windows下的密码hash——NTLM hash和Net-NTLM hash介绍》比较了NTLM hash和Net-NTLM hash的区别&#xff0c;本文将继续对Net-NTLM hash在内网渗透中的应用作介绍&#xff0c;解决一个有趣的问题&#xff1a; 如果获得了内网一个文件服务器的权限&#…

第十节: 利用SQLServer实现Quartz的持久化和双机热备的集群模式 :

背景&#xff1a; 默认情况下&#xff0c;Quartz.Net作业是持久化在内存中的&#xff0c;即 quartz.jobStore.type "Quartz.Simpl.RAMJobStore, Quartz"&#xff0c;这种模式有以下弊端&#xff1a; ① 想在A服务器上控制B服务器上已经发布了的job和trigger不方便&a…

第十节: 利用SQLServer实现Quartz的持久化和双机热备的集群模式

背景&#xff1a; 默认情况下&#xff0c;Quartz.Net作业是持久化在内存中的&#xff0c;即 quartz.jobStore.type "Quartz.Simpl.RAMJobStore, Quartz"&#xff0c;这种模式有以下弊端&#xff1a; ① 想在A服务器上控制B服务器上已经发布了的job和trigger不方便&a…

任务调度开源框架Quartz动态添加、修改和删除定时任务

Quartz 是个开源的作业调度框架&#xff0c;为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听。Quartz 允许开发人员根据时间间隔&#xff08;或…

第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借助TopSelf、服务类】)

一. IIS部署 比如在MVC框架中集成了Quartz.Net定时调度&#xff0c;此时该调度系统会随着MVC框架被挂在IIS下&#xff0c;IIS会进程回收&#xff0c;所以大部分开发都会遇到Quartz挂在IIS下一段时间不好用。 补充&#xff1a;IIS可以设置定时自动回收&#xff0c;默认回收是174…

[你必须知道的.NET] 第二回:对抽象编程:接口和抽象类

本文将介绍以下内容&#xff1a; • 面向对象思想&#xff1a;多态 • 接口 • 抽象类 1. 引言 在我之前的一篇post《抽象类和接口的谁是谁非》中&#xff0c;和同事管伟的讨论&#xff0c;得到很多朋友的关注&#xff0c;因为是不成体系的论道&#xff0c;所以给大家了解造…

Linux 启动失败 磁盘阵列,组建RAID5重启系统,出现md127的解决办法

我这里在组建RAID5之后重启了系统&#xff0c;当时/dev/md0变成了/dev/md127。出现这问题主要是我没有配置生成/etc/mdadm.conf文件&#xff0c;如果哪位伙伴出现类似我这种情况&#xff0c;而不是通过我这种方法解决的&#xff0c;希望能分享一下你的解决方法&#xff0c;谢谢…

[你必须知道的.NET] 第三回:历史纠葛:特性和属性

本文将介绍以下内容&#xff1a; • 定制特性的基本概念和用法 • 属性与特性的区别比较 • 反射的简单介绍 1. 引言 attribute是.NET框架引入的有一技术亮点&#xff0c;因此我们有必要花点时间来了解本文的内容&#xff0c;走进一个发现attribute登堂入室的入口。因为.N…

Linux的性能故障的含义,Linux排查性能故障的方法

好了&#xff0c;鉴于我们的Linux发行版现已安装&#xff0c;许多方面看起来似乎根本不“好”。今天我们将介绍为安装的Linux排查性能故障的方法。虽然今天的这篇文章明显倾向于Ubuntu&#xff0c;但我们探讨的几乎一切内容都同样适用于每个Linux发行版。要是哪些命令是专门针对…

[你必须知道的.NET] 第四回:后来居上:class和struct

本文将介绍以下内容&#xff1a; • 面向对象基本概念 • 类和结构体简介 • 引用类型和值类型区别 1. 引言 提起class和struct&#xff0c;我们首先的感觉是语法几乎相同&#xff0c;待遇却翻天复地。历史将接力棒由面向过程编程传到面向对象编程&#xff0c;class和stru…

linux shell跳板机,用shell开发跳板机

信号列表&#xff1a;在linux中和信号相关的常见命令为kill及trap命令&#xff0c;下来如何利用trap控制跳板机脚本来使用命令&#xff1a;命令&#xff1a;kill -l 和 trap -l企业实战中linux系统的重要信号及说明HUP(1) 挂起INT(2) 中断OUIT(3) 退…

[你必须知道的.NET] 第五回:深入浅出关键字---把new说透

本文将介绍以下内容&#xff1a; 面向对象基本概念new关键字深入浅出对象创建的内存管理 1. 引言 园子里好像没有或者很少把new关键字拿出来说的&#xff0c;那我就占个先机吧&#xff0c;呵呵。那么&#xff0c;我们到底有必要将一个关键字拿出来长篇大论吗&#xff1f;看来…

linux tcp server开源,GitHub - 06linux/cellnet: 高性能,简单,方便的开源服务器网络库...

cellnetcellnet是一个高性能&#xff0c;简单&#xff0c;方便的开源服务器网络库自由混合编码&#xff0c;业务代码无需调整。TCP和html5的应用都可以直接使用cellnet迅速搭建服务器框架。与Java的Netty或Mina网络库类似的Handler机制将给予强大定制功能。特性数据协议支持混合…

[你必须知道的.NET] 第六回:深入浅出关键字---base和this

本文将介绍以下内容&#xff1a; 面向对象基本概念base关键字深入浅出this关键字深入浅出1. 引言 new关键字引起了大家的不少关注&#xff0c;尤其感谢Anders Liu的补充&#xff0c;让我感觉博客园赋予的交流平台真的无所不在。所以&#xff0c;我们就有必要继续这个话题&…

[你必须知道的.NET] 第七回:品味类型---从通用类型系统开始

本文将介绍以下内容&#xff1a; .NET 基础架构概念 类型基础通用类型系统CLI、CTS、CLS的关系简述1. 引言 本文不是连环画&#xff0c;之所以在开篇以图形的形式来展示本文主题&#xff0c;其实就是想更加特别的强调这几个概念的重要性和关注度&#xff0c;同时希望从剖析其关…

[你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理

本文将介绍以下内容&#xff1a; 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用1. 引言 买了新本本&#xff0c;忙了好几天系统&#xff0c;终于开始了对值类型和引用类型做个全面的讲述了&#xff0c;本系列开篇之时就是因为想写这个主题&#xff0c;…