现在存在这样一种情况,我需要用Quartz定时每天的0点0分跑jobs,但是job有很多个(线程池的原因,线程数不够,只能让一部分先跑,等线程释放后再跑余下的job),不能保证每个job在秒级跑完,因此导致等余下的job拿的线程准备跑的时候,发现已经错过了触发的那一秒时间,导致这些job没有执行。
我想到一种方法:*/60 0 0 * * ?, 但是60超出了秒的最大数59,这样会报错。
有谁有更好的解决方法吗??
如何处理Misfired任务
在Quartz应用中,misfiredjob是经常遇到的情况。一般来说,下面这些原因可能造成misfiredjob:
1)系统因为某些原因被重启。在系统关闭到重新启动之间的一段时间里,可能有些任务会
被misfire;
2)Trigger被暂停(suspend)的一段时间里,有些任务可能会被misfire;
3)线程池中所有线程都被占用,导致任务无法被触发执行,造成misfire;
4)有状态任务在下次触发时间到达时,上次执行还没有结束;
为了处理misfiredjob,Quartz中为trigger定义了处理策略,主要有下面两种:
MISFIRE_INSTRUCTION_FIRE_ONCE_NOW:针对misfiredjob马上执行一次;
MISFIRE_INSTRUCTION_DO_NOTHING:忽略misfiredjob,等待下次触发;
-。-使用线程池的时候,记住一个原则,尽量让每一条线程的工作消耗限制在短时间内,线程池才能有效发挥作用,否则,请老老实实的一条主线程同步来做。另外,也可以考虑将任务分步骤来做,每个步骤之间是同步的,步骤内用线程池异步多线程来做,步骤之间的同步用阻塞等待信号量或者其他方案自己考虑吧。至于你说的错过了触发的问题,我觉得这个是你设计有问题,既然这些Job是有执行顺序的要求,那干嘛要放到一个trigger触发呢?要我说,你就该设计一个job,把你现在的jobs都分成步骤,在一个job里控制另外,可以启动多个scheduler实例、多个线程池嘛 谢谢你的回答,这些job是没有触发顺序的,但必须是同一时间被触发。虽然通过扩展线程数可以解决,但是对以后的扩展不方便,如果还有增加job,那就还有增加线程池数。这些job必须同时触发也是业务需求,没法变。写个队列,到了指定时间就把需要执行的job放进去,然后分给线程池去跑,跑过的就从队列中删除,直到把队列中的任务跑完。一个线程,多个job,还要同时触发,你这是啥需求啊?http://java.dzone.com/articles/quartz-scheduler-misfire版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。