PS: 最近项目需要定时进行数据汇总,引入了Quartz之后发现,开始的时候任务可以执行,一段时间后后台看不到报错,但是任务却不执行。
出现这种问题还没报错,那么大概率是quartz自己的线程全部用完,导致任务无法继续执行。
首先我们的定时任务是基于数据库管理的,非内存。此处可配置。
解决问题的思路
首先通过日志排查错误,但是没有错误日志。
-
查看quartz的数据表qrtz_triggers
任务就算不执行也会往后延期。这个下次执行时间是动态的。因为任务没法执行,时间就会慢慢的向后延。
-
此时首先要查看数据库连接数和quartz的线程总数。
因为可能数据库的连接数满了也会导致问题(这个问题会报错,因为我遇到了,所以说下)
-
查看quartz的线程总数
此处我设置了50个线程。
-
查看正在执行的任务占用了几个线程qrtz_fired_triggers 这个数据表会显示正在执行的线程有哪些
我这边显示是一个,但是问题没解决前是50个。正好占用了所有的quartz线程数,导致不报错也不运行。
定位到问题后,你就可以着手看下哪些任务一直占有着线程,解决问题。