程序员-Eureka 2024-05-14 22:37 采纳率: 0%
浏览 368
已结题

quartz框架,No record found for selection of Trigger with key


org.quartz.JobPersistenceException: Couldn't retrieve trigger: No record found for selection of Trigger with key: 'RECOVERING_JOBS.recover_X.X.X.X1415014951113_1415015028210' and statement: SELECT * FROM QRTZ_SIMPLE_TRIGGERS WHERE SCHED_NAME = 'ClusterScheduler' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ?
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveTrigger(JobStoreSupport.java:1533)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.recoverMisfiredJobs(JobStoreSupport.java:979)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.doRecoverMisfires(JobStoreSupport.java:3199)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$MisfireHandler.manage(JobStoreSupport.java:3947)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$MisfireHandler.run(JobStoreSupport.java:3968)
Caused by: java.lang.IllegalStateException: No record found for selection of Trigger with key: 'RECOVERING_JOBS.recover_X.X.X.X1415014951113_1415015028210' and statement: SELECT * FROM QRTZ_SIMPLE_TRIGGERS WHERE SCHED_NAME = 'ClusterScheduler' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ?
    at org.quartz.impl.jdbcjobstore.SimpleTriggerPersistenceDelegate.loadExtendedTriggerProperties(SimpleTriggerPersistenceDelegate.java:95)
    at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectTrigger(StdJDBCDelegate.java:1819)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveTrigger(JobStoreSupport.java:1531)
    ... 4 common frames omitted

集群模式中,为啥会出现这种错误啊?有什么根治的办法吗?是我哪里配置不对吗?是事务不一致还是高并发导致?查看了quartz的github上问题单,确实也有这个问题单,但是不知道怎么使用才可以解决这个问题,我使用的的springboot 版本是2.7.18,quartz版本是2.4.0,给出解决办法,有偿悬赏!

  • 写回答

14条回答 默认 最新

  • 专家-司宇[在线] 2024-05-14 22:39
    关注

    引自免费微信小程序:皆我百晓生

    遇到这个错误,通常是由于Quartz在尝试恢复一个已过期(misfired)的触发器时,在数据库中找不到相应的记录。这可能由以下几个原因造成:

    1. 数据一致性问题:可能是由于事务管理不当,导致在调度作业与持久化触发器信息之间出现了不一致。例如,作业执行后触发器状态更新失败。

    2. 并发冲突:在高并发环境下,尤其是在集群部署时,多个节点同时访问或修改同一触发器的状态,可能导致某些操作丢失或未被正确应用。

    3. 误删除或更新:数据库中的相关表(如QRTZ_TRIGGERS、QRTZ_SIMPLE_TRIGGERS等)可能存在记录被意外删除或更新的情况。

    4. 配置问题:Quartz配置不正确,比如org.quartz.jobStore.misfireThreshold设置得过短,或者与数据库相关的配置(如连接字符串、事务管理等)有误。

    解决方案

    1. 检查事务管理配置

    确保你的Quartz配置正确地处理了事务,特别是当使用JDBCJobStore时。确认Spring Boot配置中事务传播行为是否合适,例如使用@Transactional注解确保操作的原子性。

    # application.yml 示例
    spring:
      quartz:
        job-store-type: jdbc
        jdbc:
          initialize-schema: never # 或 always, if needed
          table-prefix: QRTZ_
        properties:
          org.quartz.jobStore.isClustered: true
          org.quartz.jobStore.clusterCheckinInterval: 20000
          org.quartz.jobStore.misfireThreshold: 60000 # 设置较大的misfire阈值,减少误报
    

    2. 集群同步优化

    • 确保所有集群节点的Quartz配置一致。
    • 考虑使用更高级的集群模式,如使用org.quartz.scheduler.instanceId=AUTO来自动分配实例ID,减少手动配置出错。

    3. 数据库检查与维护

    • 执行数据库的一致性检查,确认QRTZ_开头的表中数据无异常。
    • 定期清理过期的触发器和作业记录,避免数据库膨胀导致查询效率下降。

    4. 异常处理和日志监控

    • 在应用中增加更详细的日志记录,特别是在调度、恢复作业和数据库交互的地方,以便于追踪问题。
    • 实现Quartz的监听器(如JobListener、TriggerListener),在作业执行前后进行状态检查和日志记录。

    5. 更新或回滚版本

    • 虽然你提到的Quartz版本2.4.0和Spring Boot 2.7.18相对稳定,但也不排除特定版本间存在兼容性问题。考虑查阅官方文档或社区讨论,看是否有已知问题,并评估是否需要升级或降级至更稳定的版本组合。

    高级策略

    • 如果并发问题严重,可以考虑使用分布式锁机制(如Redis、Zookeeper)来同步对触发器状态的操作,确保在集群环境中操作的唯一性。

    注意

    确保在进行任何配置更改或升级前,备份好现有数据库和配置文件,以防不测。

    以上步骤应该能帮助你诊断并解决这个问题。如果问题依旧,可能需要更深入地分析应用日志和数据库状态,或者在Quartz的官方论坛或GitHub上寻求更具体的帮助。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月15日
  • 创建了问题 5月14日