我正在使用 quartz 简单触发器( quartz 2.2.1),设置为无限期重复。所有计划在生产中都运行良好,但最近它们停止工作,并且下一次火灾时间也没有更新。 如果我使用 rescheduleJobquartz API 更新计划,它会在一段时间内正常工作,然后再次陷入卡住状态。 有关于这是如何发生的任何信息吗?
线程转储通过 onObject 监控显示所有处于定时等待状态的线程。
"UDPQuartzScheduler_Worker-8" #49 prio=4 os_prio=0 tid=0x00007f88d71a8000 nid=0x30b6 in Object.wait() [0x00007f8928b30000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)
- locked <0x00000006ddc9d6b0> (a java.lang.Object)
"UDPQuartzScheduler_Worker-7" #48 prio=4 os_prio=0 tid=0x00007f88d71a6000 nid=0x30b5 in Object.wait() [0x00007f8928c31000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)
- locked <0x00000006ddc9d6f8> (a java.lang.Object)
"UDPQuartzScheduler_Worker-6" #47 prio=4 os_prio=0 tid=0x00007f88d71a4000 nid=0x30b4 in Object.wait() [0x00007f8928d32000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)
- locked <0x00000006ddc9f000> (a java.lang.Object)
最佳答案
即使增加线程数,您也可能会遇到同样的问题,因为您的工作线程将再次卡住。 要解决此问题,您必须检查工作线程代码并检查它们是否卡住或某些任务执行时间过多(基本上,当您编写/读取太多数据)。这两个原因也造成了失火问题。
如果您找不到与我上面提到的要点相关的任何内容,那么您可以通过工作线程创建单独的线程,而不是在工作线程上执行它。它肯定会解决您的问题,但如果应用程序进程中卡住了太多线程,那么您的应用程序将被卡住,但同时您将从应用程序进程堆栈跟踪中获得此问题的确切原因。
关于java - quartz 简单触发器在一段时间后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45671590/