问题发生环境:
1.通过继承Job执行quartz任务
2.大概有30多个quartz任务
问题发生现象:
1.所有任务日志均无输出,似乎都停止了
问题发生原因:
1.这30多个任务中,有一个任务【JOB-1】在执行时处理过慢,发生了阻塞。
2.因为是通过继承Job执行quartz任务,到了设定的时间间隔后,【JOB-1】在上次还没有执行完的情况下,再次执行。
3.由于【JOB-1】的阻塞,quartz的线程池(默认10个)被耗尽。
4.quartz没有多余的线程来执行新的任务
问题分析工具:
通过 jmc.exe 或者 jvisualvm.exe 查看当前线程dump,会发现quartz相关所有的线程都阻塞在【JOB-1】里
问题解决方案:
1.对于同一个任务,实行同步制,也就是说,在上次还没执行完的情况下,不能再次执行。
2.@DisallowConcurrentExecution 或者 StatefulJob 或者 自己实现相关同步机制