java - 所有 Quartz Scheduler 线程都进入 TIMED_WAITING?

标签 java spring multithreading quartz-scheduler

我有 Spring 和 Quartz 作业(集群)定期运行(1 分钟)。当服务器启动时,一切似乎都很好,但一段时间后不会触发作业。重新启动服务器使作业运行,但一段时间后问题再次出现。

我怀疑这是一个线程耗尽问题,从线程转储中我注意到我的所有 Quartz 线程 (10) 都处于 TIMED_WAITING 状态。

配置:

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5

线程转储:

quartzScheduler_Worker-10 - priority:10 - threadId:0x00007f8ae534d800 - nativeId:0x13c78 - state:TIMED_WAITING stackTrace:
    java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000066cd73220> (a java.lang.Object)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)
        - locked <0x000000066cd73220> (a java.lang.Object)

使用quartz 2.2.1(我怀疑这是否可能是版本特定问题)

我从日志中验证不存在数据库连接问题。

请帮助诊断问题。我是否有可能耗尽系统资源(线程数)?但我的作业是同步的,仅当其所有子线程完成其任务时才存在,并且我也有此注释 @DisallowConcurrentExecution

最佳答案

根本原因是我们在 quartz 工作中发生了太多火灾。我们每 1 分钟就会启动一次 quartz ,而工作并不能真正在 1 分钟内完成,因此当未命中时, quartz 会首先尝试执行它们,因此工作会堆积起来。

在此过程中,需要执行未命中更新操作,该操作需要花费大量时间,导致 quartz 卡住。从线程转储中可以明显看出这一点,其中我们所有的 quartz 线程都处于 TIMED_WAITING 状态,如下所示

quartzScheduler_Worker-10 - priority:10 - threadId:0x00007f8ae534d800 - nativeId:0x13c78 - state:TIMED_WAITING
stackTrace:
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000066cd73220> (a java.lang.Object)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)
- locked <0x000000066cd73220> (a java.lang.Object)

引用:https://jira.terracotta.org/jira/si/jira.issueviews:issue-html/QTZ-357/QTZ-357.html

对于我们的用例,未命中的火灾可以忽略,并且可以在下次运行时选择。因此我将 Misfire 指令更改为忽略,如下所示

<property name="misfireInstructionName" value="MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY" />

关于java - 所有 Quartz Scheduler 线程都进入 TIMED_WAITING?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44626679/

相关文章:

java - 如果 Quartz Scheduler 死了,我该如何停止它启动的子 Java 进程?

java - JAVA中字符串数组的定义

java - 网络摄像头 - 检测 QR 码,拍摄快照和解码

java - 实体/行仅有时使用 Spring/Hibernate 更新?

java - @Autowired 类中的监听器被调用两次

java - 线程安全比较方法

javascript - 来自 JavaScript Websocket 的 InputStream Java 未收到完整消息

java - 我一直收到 "else without if"错误

java - 使用 Spring AOP 时是否代理了所有方法?

multithreading - <Spring Batch> 为什么使 ItemReader 线程安全会导致我们失去可重新启动性?