quartz的使用注意事项

在使用Quartz进行定时任务调度时,可能会遇到'Handling trigger(s) that missed their scheduled fire-time'的错误。这通常由于工作线程繁忙、调度器故障或任务设置在未来时间导致。本文总结了问题原因、排查步骤和解决方案,包括调整misfireThreshold以防止并发不足,以及设置合适的线程池大小。此外,还介绍了misfire策略如immediate执行和忽略,以及一次性任务的失火处理。解决方式在于优化配置,例如将misfireThreshold设为60000(1分钟)并增大线程池到20。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

在使用quartz做定时任务调度时,遇到的问题:
Handling 7 trigger(s) that missed their scheduled fire-time.

可能原因:

此问题产生的原因就是quartz该启动的任务没有启动起来,就会有这个报错,
网上查找到的三个原因是:
1.所有的woker thread(工作线程; 辅助线程)都在运行其他的job
2.scheduler(调度器)down了
3.任务被安排在过去的某一时刻启动(此可能为代码错误)

排查中发现遇到的问题就是第一个原因,
同时需要注意的是Quartz.properties文件的配置
org.quartz.jobStore.misfireThreshold(毫秒级) :他被认为是在任务到了执行时间还未执行的允许超时时间。之前设置了1,
就会造成只要并发出现,线程不够用,就会出现misfired错误,也就是上面的错误。
org.quartz.threadPool.threadCount:线程池的大小,这个默认是10,可以根据自己的需要取设置。这个决定了并发量的大小。

后续问题:

同时在出现上述“失火”事件后,我们还可以设置救火方案,就是在newTrigger()时,设置withSchedule的策略,
策略目前有
withMisfireHandlingInstructionFireNow:调度器发现misfire情况后,立即执行job。
withMisfireHandlingInstructionNextWithRemainingCount:什么都不做。misfire被忽略了,并且没有后续的执行。
withMisfireHandlingInstructionDoNothing:所有被misfire的执行都被忽略掉,调度器会像平时一样等待下次调度。

具体的策略含义可以上网查找一下使用。
但对于只有一次的调度策略来说,失火事件的发生,会造成任务不被执行的错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值