notifyJobStoreJobComplete方法中的Quartz失败

时间:2012-02-01 10:51:52

标签: mysql quartz-scheduler

情境:

  1. 我们有一个使用JDBC Job Store的调度程序。 Quartz版本是2.1.2。
  2. 正在安排的工作也在更新数据库。
  3. 数据库对于quartz和作业本身都是相同的,并且托管在MySQL Server中。应用程序表和石英表都存储在同一个数据库中。
  4. 应用程序和石英的连接池不同。在应用程序中,我们使用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
    
  5. 数据库与两台服务器上的MASTER-MASTER复制集群在一起,它们通过应用程序和石英中的虚拟IP使用。

  6. 调度程序,即quartz也集中在MySQL集群的两台机器上。
  7. 问题:

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

    问题:

    1. 问题的原因是什么?
    2. 如何将BLOCKED作业移动到WAITING状态,以便作业可以至少在下一个预定时间运行。直接编辑QRTZ_SIMPLE_TRIGGERS表并不是一个好的解决方案,即使它有效。
    3. 编辑:提出问题。

2 个答案:

答案 0 :(得分: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”来避免此问题。

答案 1 :(得分:0)

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

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

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