首页 文章

notifyJobStoreJobComplete方法中的Quartz失败

提问于
浏览
2

场景:

  • 我们有一个使用JDBC Job Store的调度程序 . Quartz版本是2.1.2 .

  • 正在调度的作业也在更新数据库 .

  • 石英和作业本身的数据库是相同的,并且托管在MySQL服务器中 . 应用程序表和石英表都存储在同一个数据库中 .

  • 连接池对于应用程序和石英都是不同的 . 在应用程序中,我们使用spring进行连接池,而quartz则强制使用quartz.properties连接池 . 这是quartz.properties的片段

org.quartz.dataSource.qzDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL = jdbc:mysql://localhost:3306/dbname?autoReconnect=true
org.quartz.dataSource.qzDS.user = dbuser
org.quartz.dataSource.qzDS.password =dbpassword
org.quartz.dataSource.qzDS.maxConnections = 30
org.quartz.datasource.qzDS.validationQuery = select 1
#org.quartz.datasource.qzDS.minEvictableIdleTimeMillis=21600000
#org.quartz.datasource.qzDS.timeBetweenEvictionRunsMillis=1800000
#org.quartz.datasource.qzDS.numTestsPerEviction=-1
#org.quartz.datasource.qzDS.testWhileIdle=true
org.quartz.datasource.qzDS.debugUnreturnedConnectionStackTraces=true
org.quartz.datasource.qzDS.unreturnedConnectionTimeout=120
org.quartz.datasource.qzDS.initialPoolSize=5
org.quartz.datasource.qzDS.minPoolSize=5
org.quartz.datasource.qzDS.maxPoolSize=30
org.quartz.datasource.qzDS.acquireIncrement=5
org.quartz.datasource.qzDS.maxIdleTime=120
org.quartz.datasource.qzDS.validateOnCheckout=true
  • 数据库在两台服务器上与MASTER-MASTER复制进行集群,它们通过应用程序和石英中的虚拟IP使用 .

  • Scheduler,即quartz也集中在MySQL集群的两台机器上 .

问题:

其中一个服务器(到目前为止我们遇到了备份服务器机器的问题)在调用notifyJobStoreJobComplete方法时偶尔会抛出数据库连接错误 . 这导致作业保持在BLOCKED状态,即使作业本身已成功完成但石英无法更新其状态 .

问题:

  • 问题的原因是什么?

  • 如何将BLOCKED作业移动到WAITING状态,以便作业可以至少在下一个预定时间运行 . 直接编辑QRTZ_SIMPLE_TRIGGERS表并不是一个好的解决方案,即使它有效 .

编辑:提出问题 .

2 回答

  • 0

    notifyJobStoreJobComplete期间的错误是:org.quartz.impl.jdbcjobstore.JobStoreTX - 无法覆盖连接自动提交/事务隔离 . [java] com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:从服务器成功收到的最后一个数据包是619,082,686毫秒之前 . 成功发送到服务器的最后一个数据包是619,082,686毫秒之前 . 比服务器配置的'wait_timeout'值长 . 您应该考虑在应用程序中使用之前到期和/或测试连接有效性,增加服务器配置的客户端超时值,或使用Connector / J连接属性“autoReconnect = true”来避免此问题 .

  • 0

    我认为主要的问题是MySQL的通信链路故障,我们通过将'wait_timeout'增加到14天来解决它,并且由于我们每15天安排一次维护,我们重启每个MySQL服务器是我们的数据库集群(我们有Master-Master)复制到位) . 通过方法,我们之后没有任何通信链路故障 . 实际上有些时候我们不会每15天重启服务器但仍然没有错误(触摸木板) . :)

    至于Quartz触发器被锁定在BLOCKED状态,我们将石英更新为2.1.4,它可能具有几乎相同的problem的修复 . 在石英更新之后,我们面对处于阻塞状态的触发器非常频繁 .

    我们仍然无法找到如何在不直接修改石英表的情况下使触发器退出BLOCKED状态 . 每当我们遇到这个问题时,我们都会从qrtz_fired_triggers表中手动删除BLOCKED触发器的条目,它解决了这个问题 . 我认为石英的企业版可能会从某些Web UI中获得此功能 .

相关问题