Quartz学习笔记(四)SimpleTrigger,CronTrigger

SimpleTrigger

SimpleTrigger主要可以满足一些简单的调度需求,比如在某个时间点执行一次,或者在某个时间点开始执行,然后以某一个时间间隔来重复执行。SimpleTrigger的属性包括:开始时间、结束时间、重复次数以及重复的间隔。其中关于结束时间需要有特殊注意的地方

SimpleTrigger相关属性设置API

方法设置类描述备注
startAt(Date triggerStartTime)TriggerBuilder设置任务开始时间用DateBuilder可以轻松获取参数Date
startNow()TriggerBuilder设置任务开始为当前时间
endAt(Date triggerEndTime)TriggerBuilder设置任务介绍时间用DateBuilder可以轻松获取参数Date
withIntervalInMilliseconds(long intervalInMillis)SimpleScheduleBuilder设置任务执行间隔,单位:毫秒
withIntervalInSeconds(int intervalInSeconds)SimpleScheduleBuilder设置任务执行间隔,单位:秒
withIntervalInMinutes(int intervalInMinutes)SimpleScheduleBuilder设置任务执行间隔,单位:分
withIntervalInHours(int intervalInHours)SimpleScheduleBuilder设置任务执行间隔,单位:小时
withRepeatCount(int triggerRepeatCount)SimpleScheduleBuilder设置任务重复次数
repeatForever()SimpleScheduleBuilder无限期重复
repeatSecondlyForever(int seconds)SimpleScheduleBuilder设置以多少秒的间隔永远重复重载的方法没有参数,默认1秒
repeatMinutelyForever(int minutes)SimpleScheduleBuilder设置以多少分的间隔永远重复重载的方法没有参数,默认1分
repeatHourlyForever(int hours)SimpleScheduleBuilder设置以多少小时的间隔永远重复重载的方法没有参数,默认1小时
repeatSecondlyForTotalCount(int count, int seconds)SimpleScheduleBuilder以给定的秒数数间隔重复给定的次数重载的方法没有seconds参数,默认1秒
repeatMinutelyForTotalCount(int count, int minutes)SimpleScheduleBuilder以给定的分钟数数间隔重复给定的次数重载的方法没有seconds参数,默认1分钟
repeatHourlyForTotalCount(int count, int hours)SimpleScheduleBuilder以给定的小时数间隔重复给定的次数重载的方法没有seconds参数,默认1小时

上面表格中的方法基本包含了设置SimpleTrigger所有方法,可以看出主要是通过TriggerBuilder和SimpleScheduleBuilder来设置的。其中关于结束时间我们需要注意endTime属性的值会覆盖设置重复次数的属性值。很好理解,假如你设置开始时间为早上8点,结束时间为早上9点,每间隔10分钟执行一次,你是不需要去设置重复次数的,设置了也会被Quertz自动计算的重复次数覆盖。
另一方面,TriggerBuilder(以及Quartz的其它builder)会为那些没有被显式设置的属性选择合理的默认值。比如:如果你没有调用withIdentity(…)方法,TriggerBuilder会为trigger生成一个随机的名称;如果没有调用startAt(…)方法,则默认使用当前时间,即trigger立即生效。

例子代码
指定开始时间和结束时间,每隔10秒执行一次

		Date startTime =DateBuilder.dateOf(12, 12, 12, 20, 4, 2019);
		Date endTime =DateBuilder.dateOf(12, 14, 12, 20, 4, 2019);
		Trigger trigger = TriggerBuilder
				.newTrigger().withIdentity("simperTrigger1", "test1")
				.startAt(startTime)
				.withSchedule(SimpleScheduleBuilder
						.simpleSchedule()
						.withIntervalInSeconds(10))
				.endAt(endTime)
				.build();

SimpleTrigger的Misfire策略

关于Trigge的MisFire策略在之前的学习中已经接触过了,这里在详细分不同的Trigger来学习一下。在Trigger中关于SimpleTrigger的Misfire策略常量如下,并且可以通过SimpleSchedulerBuilder设置

MISFIRE_INSTRUCTION_FIRE_NOW

设置方法:
withMisfireHandlingInstructionFireNow
含义:
——以当前时间为触发频率立即触发执行
——执行至EndTIme的剩余周期次数
——以调度或恢复调度的时刻为基准的周期频率,EndTIme根据剩余次数和当前时间计算得到
——调整后的EndTIme会略大于根据StartTime计算的到的EndTIme值

MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY

设置方法:
withMisfireHandlingInstructionIgnoreMisfires
含义:
——以错过的第一个频率时间立刻开始执行
——重做错过的所有频率周期
——当下一次触发频率发生时间大于当前时间以后,按照Interval的依次执行剩下的频率
——共执行RepeatCount+1次

MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_CO

设置方法:withMisfireHandlingInstructionNowWithExistingCount
含义:
——以当前时间为触发频率立即触发执行
——执行至EndTIme的剩余周期次数
——以调度或恢复调度的时刻为基准的周期频率,EndTIme根据剩余次数和当前时间计算得到
——调整后的EndTIme会略大于根据StartTime计算的到的EndTIme值

MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT

设置方法:withMisfireHandlingInstructionNowWithRemainingCount
含义:
——以当前时间为触发频率立即触发执行
——执行至EndTIme的剩余周期次数
——以调度或恢复调度的时刻为基准的周期频率,EndTIme根据剩余次数和当前时间计算得到
——调整后的EndTIme会略大于根据StartTime计算的到的EndTIme值

MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT

设置方法:withMisfireHandlingInstructionNextWithRemainingCount
含义:
——不触发立即执行
——等待下次触发频率周期时刻,执行至EndTIme的剩余周期次数
——以StartTime为基准计算周期频率,并得到EndTIme
——即使中间出现pause,resume以后保持EndTIme时间不变

MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT

设置方法:withMisfireHandlingInstructionNextWithExistingCount
含义:
——此指令导致trigger忘记原始设置的StartTime和repeat-count
——触发器的repeat-count将被设置为剩余的次数
——这样会导致后面无法获得原始设定的StartTime和repeat-count值

默认策略

查看源码,SimpleScheduleBuilder中misfireInstruction的默认值是MISFIRE_INSTRUCTION_SMART_POLICY,这是所有Trigger默认的MisFire策略,这个策略会根据Trigger的状态和类型来自动调节MisFire策略。
查看源码可以看到,若设置为默认策略,则按照以下规则来选择MisFire策略

  • 如果重复计数为0,则指令将解释为MISFIRE_INSTRUCTION_FIRE_NOW。
  • 如果重复计数为REPEAT_INDEFINITELY,则指令将解释为MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT。 警告:如果触发器具有非空的结束时间,则使用MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT可能会导致触发器在失火时间范围内到达结束时,不会再次触发。
  • 如果重复计数大于0,则指令将解释为MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT。

CronTrigger

CronTrigger能精确的制定时间和时间间隔,可以通过设置Cron Expressions来配置CronTrigger,Cron Expressions是由七个子表达式组成的字符串,用于描述日程表的各个细节。具体怎么设置可与参照在线Cron表达式生成器,你甚至可以把它内嵌到你的项目中,用于生成cron表达式。

构建CronTrigger

CronTrigger实例使用TriggerBuilder(用于触发器的主要属性)和CronScheduleBuilder(对于CronTrigger特定的属性)构建。
例如,构建一个触发器,每天早上9点至下午6点运行,每一30分钟执行一次。
先通过在线CronB表达式生成器生成表达式:0 0/30 9-18 * * ?

		//构建CronTrigger
		TriggerBuilder.newTrigger()
		.withSchedule(CronScheduleBuilder.cronSchedule("0 0/30 9-18 * * ? "))
		.forJob("jobA", "groupA")
		.build();

CronTrigger Misfire

CronTrigger的Misfire有三种如下,可以通过CronSchedulerBuilder设置

MISFIRE_INSTRUCTION_DO_NOTHING

设置方法:withMisfireHandlingInstructionDoNothing
含义:
——不触发立即执行
——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行

MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY

设置方法:withMisfireHandlingInstructionIgnoreMisfires
含义:
——以错过的第一个频率时间立刻开始执行
——重做错过的所有频率周期后
——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行

MISFIRE_INSTRUCTION_FIRE_ONCE_NOW

设置方法:withMisfireHandlingInstructionFireAndProceed
含义:
——以当前时间为触发频率立刻触发一次执行
——然后按照Cron频率依次执行

默认策略

在SimpleTrigger中已经提到所有trigger的默认Misfire策略都是MISFIRE_INSTRUCTION_SMART_POLICY,SimpleTrigger会根据tirgger的状态来调整具体的Misfire策略,而CronTrigger的默认Misfire策略会被CronTrigger解释为MISFIRE_INSTRUCTION_FIRE_NOW,具体可以参照CronTrigger实现类的源码

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值