quartz(8)--其他

JOB并发执行

Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞。

设置为非并发

1)Job类加上注解:@DisallowConcurrentExecution

2)spring加上配置:<property name="concurrent" value="true" />

参考链接:http://www.open-open.com/lib/view/open1412993886655.html

停止任务

scheduler.deleteJob(jobKey);

不会停止正在执行的job。暂停功能可以修改业务数据状态来控制正在执行的job或者直接操作执行job的线程(很麻烦)

misfire

类似的Scheduler资源不足的时候,或者机器崩溃重启等,有可能某一些TRIGGER在应该触发的时间点没有被触发,也就是Miss Fire了。这个时候TRIGGER需要一个策略来处理这种情况。每种TRIGGER可选的策略各不相同。
这里有两个点需要重点注意:

MisFire的触发是有一个阀值,这个阀值是配置在JobStore的。比RAMJobStore是org.quartz.jobStore.misfireThreshold。只有超过这个阀值,才会算MisFire。小于这个阀值,Quartz是会全部重新触发。
所有MisFire的策略实际上都是解答两个问题:
已经MisFire的任务还要重新触发吗?
如果发生MisFire,要调整现有的调度时间吗?

MisFire策略

MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY

这个不是忽略已经错失的触发的意思,而是说忽略MisFire策略。它会在资源合适的时候,重新触发所有的MisFire任务,并且不会影响现有的调度时间。

比如,SimpleTrigger每15秒执行一次,而中间有5分钟时间它都MisFire了,一共错失了20个,5分钟后,假设资源充足了,并且任务允许并发,它会被一次性触发。这个属性是所有Trigger都适用。

MISFIRE_INSTRUCTION_FIRE_NOW

忽略已经MisFire的任务,并且立即执行调度。这通常只适用于只执行一次的任务。

MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT

将startTime设置当前时间,立即重新调度任务,包括的MisFire的

MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT

类似MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT,区别在于会忽略已经MisFire的任务

MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT

在下一次调度时间点,重新开始调度任务,包括的MisFire的

MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT

类似于MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT,区别在于会忽略已经MisFire的任务。

MISFIRE_INSTRUCTION_SMART_POLICY

所有的Trigger的MisFire默认值都是这个,大致意思是“把处理逻辑交给聪明的Quartz去决定”。基本策略是:

1)如果是只执行一次的调度,使用MISFIRE_INSTRUCTION_FIRE_NOW

2)如果是无限次的调度(repeatCount是无限的),使用MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT否则,使用MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT

原文地址:https://www.cnblogs.com/qin-derella/p/6531294.html