开发者社区> 问答> 正文

无法解决的Quartz问题?报错

现在存在这样一种情况,我需要用Quartz定时每天的0点0分跑jobs,但是job有很多个(线程池的原因,线程数不够,只能让一部分先跑,等线程释放后再跑余下的job),不能保证每个job在秒级跑完,因此导致等余下的job拿的线程准备跑的时候,发现已经错过了触发的那一秒时间,导致这些job没有执行。

我想到一种方法:*/60 0 0 * * ?, 但是60超出了秒的最大数59,这样会报错。

有谁有更好的解决方法吗??

展开
收起
爱吃鱼的程序员 2020-06-22 18:43:29 650 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    如何处理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
    2020-06-22 18:43:47
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载