`

Quartz 1.8.0版本的死锁问题

阅读更多
先说问题的结论:https://jira.terracotta.org/jira/browse/QTZ-45
问题的解决方法:https://issues.jboss.org/browse/JBAS-8598  其实就是升级到1.8.3 就解决了

问题的源头:
项目中的代码发现死锁,jstack查看线程堆栈:

Found one Java-level deadlock:
=============================
"resin-port-9007-1558":
  waiting to lock monitor 0x00007f6e04001a38 (object 0x00000007890586c0, a java.lang.Object),
  which is held by "scheduler_Worker-2"
"scheduler_Worker-2":
  waiting to lock monitor 0x00007f6e34004a78 (object 0x0000000788fc1a68, a java.lang.Object),
  which is held by "scheduler_QuartzSchedulerThread"
"scheduler_QuartzSchedulerThread":
  waiting to lock monitor 0x00007f6e04001a38 (object 0x00000007890586c0, a java.lang.Object),
  which is held by "scheduler_Worker-2"

"scheduler_Worker-2":
	at org.quartz.core.QuartzSchedulerThread.signalSchedulingChange(QuartzSchedulerThread.java:204)
	- waiting to lock <0x0000000788fc1a68> (a java.lang.Object)
	at org.quartz.core.SchedulerSignalerImpl.signalSchedulingChange(SchedulerSignalerImpl.java:87)
	at org.quartz.simpl.RAMJobStore.triggeredJobComplete(RAMJobStore.java:1408)
	- locked <0x00000007890586c0> (a java.lang.Object)
	at org.quartz.core.QuartzScheduler.notifyJobStoreJobComplete(QuartzScheduler.java:1767)
	at org.quartz.core.JobRunShell.run(JobRunShell.java:270)
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
"scheduler_QuartzSchedulerThread":
	at org.quartz.simpl.RAMJobStore.releaseAcquiredTrigger(RAMJobStore.java:1282)
	- waiting to lock <0x00000007890586c0> (a java.lang.Object)
	at org.quartz.core.QuartzSchedulerThread.releaseIfScheduleChangedSignificantly(QuartzSchedulerThread.java:432)
	at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:288)
	- locked <0x0000000788fc1a68> (a java.lang.Object)


查看代码,具体的逻辑是:
RAMJobStore 和 QuartzSchedulerThread 都有个自己的锁对象
逻辑一:QuartzSchedulerThread-》RAMJobStore  。
QuartzSchedulerThread 本身其实是个线程,他的run方法会加自己的锁,会去检查定时的改变情况,然后会调用RAMJobStore的方法

逻辑二:RAMJobStore  ->  QuartzSchedulerThread
定时任务执行的时候,会调用RAMJobStore,RAMJobStore会调用QuartzSchedulerThread的方法通知任务的完成情况

逻辑一和逻辑二的加锁顺序相反,死锁形成。


1.8.3 版本是如何解决死锁的呢:
是改变了逻辑一:检查定时任务的情况的时候,不会去调用RAMJobStore的方法去尝试取消任务:



第一个红线的地方在1.8.0的时候,和第二个红线地方一样。红线一的地方不再调用RAMJobStore的加锁,所以死锁解决。






  • 大小: 128.4 KB
0
0
分享到:
评论

相关推荐

    quartz-1.8.0

    Quartz是Java领域一个著名的开源任务调度框架,其1.8.0版本是该软件的一个稳定发行版。这个框架主要用于创建、管理和执行计划任务,它允许开发者在应用程序中定义定时任务,实现对业务逻辑的自动触发。Quartz的核心...

    quartz3个版本 v1.7.3 v2.2.1 v2.2.2

    Quartz v2.2.2 是紧接着v2.2.1的一个小版本升级,通常这种小版本升级意味着修复了一些遗留问题或引入了额外的优化。可能包括对Java新版本的兼容性改进,性能提升,以及对用户反馈的问题进行的修复。使用这个版本,...

    quartz-2.2.3版本的quartz初始化sql语句

    在Quartz 2.2.3版本中,初始化数据库是使用Quartz的关键步骤,因为Quartz依赖于一个持久化存储来保存作业和触发器的信息。这个过程通常涉及执行一系列SQL语句来创建必要的表结构。 Quartz的初始化SQL语句主要用于...

    quartz所需jar包 1.6.0、1.8.5、2.2.1三个版本

    这个压缩包包含了Quartz的三个不同版本:1.6.0、1.8.5以及2.2.1。每个版本的jar包都有其特定的功能和改进,下面是关于这些版本的详细知识: 1. **Quartz 1.6.0**: - Quartz 1.x系列是早期的版本,主要支持JDK 1.4...

    Quartz 最新2.2.3版本所有jar包

    Quartz 2.2.3是该框架的一个稳定版本,提供了许多改进和修复,以确保更高效、可靠的任务调度。 首先,Quartz的核心特性在于其灵活的调度机制。它支持简单定时(如每5分钟执行一次)以及复杂表达式(如Cron表达式)...

    Quartz2.2版本开发手册(JAVA)

    ### Quartz 2.2 版本开发手册(JAVA) #### 1.1 使用Quartz 在使用Quartz Scheduler之前,我们需要先对其进行实例化。这一步骤通常通过`SchedulerFactory`来实现,它是创建`Scheduler`实例的主要方式。下面是一段...

    quartz_2.3.0 SQL脚本

    升级到这个版本时,用户需要注意与旧版本之间的兼容性问题,以及可能需要调整的代码或配置。 总的来说,Quartz是一个强大的作业调度库,通过提供针对不同数据库的脚本,确保了其在多样的IT环境中都能高效运行。了解...

    Quartz 2.2.2数据库表格脚本

    Quartz 2.2.2 版本是其在特定时间的一个稳定版本,它提供了丰富的功能来帮助开发者创建、安排和管理任务。在描述中提到的"数据库表格脚本"是指为了在数据库中初始化Quartz所需的表结构而准备的SQL脚本。 这些脚本...

    spring3整合quartz1.8和spring3整合quartz2.2两个版本示例

    本示例将探讨如何将 Spring 3 与 Quartz 1.8 和 2.2 版本进行整合,以实现高效的任务调度。 首先,我们来看 Spring 3 整合 Quartz 1.8 的步骤: 1. **引入依赖**:在项目中添加 Quartz 和 Spring 相关的库,确保...

    Quartz2.2版本开发手册(JAVA).pdf

    Quartz是一个功能丰富的,开源的作业调度库,可以在几乎任何Java应用程序集成-从最 小的独立的应用程序,以最大的电子商务系统。 Quartz可以用来创建简单或复杂的调度执行几十,几百,甚至是数万名成千上万的就业机会;jb...

    quartz-2.3.0-API文档-中文版.zip

    赠送jar包:quartz-2.3.0.jar; 赠送原API文档:quartz-2.3.0-javadoc.jar; 赠送源代码:quartz-2.3.0-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.0.pom; 包含翻译后的API文档:quartz-2.3.0-javadoc-API...

    quartz2.2.1帮助手册

    而“quartz2.2.1版本所有英文帮助手册”则详细介绍了这些API的使用方法和最佳实践,是学习和使用 Quartz 的重要参考资料。 通过阅读提供的"quartz_documentation"文档,开发者可以了解到如何配置 Quartz 定时器,...

    spring quartz相关jar包(多版本)

    标题"spring quartz相关jar包(多版本)"意味着这个压缩包包含了不同版本的 Spring 和 Quartz 框架的 jar 包,这主要是为了满足开发者针对不同项目或不同兼容性需求的情况。Spring 与 Quartz 的版本匹配非常重要,...

    Quartz2.2.2版本发布包脚本定义

    Quartz2.2.2是该框架的一个稳定版本,提供了诸多改进和修复,适用于各种企业级应用。 在Quartz2.2.2版本发布包中,包含了多个SQL脚本文件,这些文件主要用于在不同的数据库系统中创建必要的表结构,以便于Quartz...

    quartz-1.8.5

    在这个"quartz-1.8.5"版本中,我们专注于Spring 3.1版本集成Quartz进行定时任务的管理。 Spring框架本身提供了TaskExecution和TaskScheduling模块,可以处理简单的定时任务,但当任务调度需求变得复杂时,如需要...

    quartz-2.3.0.rar

    这个资源包"quartz-2.3.0.rar"包含了Quartz 2.3.0版本的源代码、配置文件和其他相关资源。这个版本是针对SNAPSHOT构建的,意味着它可能包含了最新的开发特性或修复。 在Quartz中,核心概念包括作业(Jobs)、触发器...

    quartz1.5,quartz1.6,quartz1.8

    Quartz1.5,Quartz1.6,Quartz1.8。Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个...

    Quartz2.2版本开发手册(JAVA).doc

    Quartz 是一个强大的开源任务调度库,专为 Java 应用设计,可在各种规模的项目中集成使用,从简单的单机应用到复杂的电子商务系统。它提供了丰富的功能,允许开发者创建简单或复杂的作业调度,用于执行数量庞大的...

    quartz所需要的jar包

    Quartz是一个开源的作业调度框架,它允许开发者创建、组织和执行计划任务。在Java应用程序中,Quartz常被用来实现定时任务,如定期备份数据库、发送邮件或执行其他维护工作。这个压缩包包含了运行Quartz程序所需的...

Global site tag (gtag.js) - Google Analytics