Spring Boot + Docker环境下Quartz集群模式任务无法故障转移至其他节点的问题排查求助
Spring Boot + Docker环境下Quartz集群模式任务无法故障转移至其他节点的问题排查求助
大家好,我目前碰到了一个Quartz集群故障转移的棘手问题,想请教下社区的各位:
我有一个Spring Boot应用,部署了两个Docker实例,使用Quartz的集群模式,共享同一个MySQL数据库。但现在遇到的问题是,当我关闭其中一个实例时,任务和请求并没有像预期那样切换到另一个节点上。
我的Quartz配置(application.yml)
quartz: job-store-type: jdbc scheduler-name: scheduler jdbc: initialize-schema: never properties: org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource: dataSource org.quartz.jobStore.tablePrefix: QRTZ_ org.quartz.jobStore.isClustered: true org.quartz.jobStore.useProperties: true org.quartz.jobStore.clusterCheckinInterval: 2000 org.quartz.scheduler.instanceId: AUTO org.quartz.scheduler.instanceName: MyScheduler org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount: 2 org.quartz.threadPool.threadPriority: 5 org.quartz.scheduler.wrapJobExecutionInUserTransaction: false org.quartz.dataSource.dataSource.driver: com.mysql.cj.jdbc.Driver org.quartz.dataSource.dataSource.URL: jdbc:mysql://localhost:3306/replica_db org.quartz.dataSource.dataSource.user: root org.quartz.dataSource.dataSource.password: admin org.quartz.jobStore.misfireThreshold: 20000
问题现象
我原本预期的是,当其中一个实例关闭后,正在运行的任务会自动转移到另一个节点继续执行。但实际情况是,关掉实例后,任务直接停止运行了,并没有故障转移到另一个节点。
已经确认数据库里的QRTZ_系列表都正确创建了,而且日志里也没有出现和Quartz集群相关的错误信息。
我已经尝试过的操作
- 检查数据库锁:发现任务好像卡在数据库里,但另一个节点并没有去拾取这些任务
- 配置了
misfireThreshold: 20000,但故障转移时任务并没有被重试 - 确认了Cluster Check-in Interval设置为2000ms,按道理集群应该能快速检测到节点故障
- 验证了两个实例的
instanceName是相同的
想请教的问题
- 为什么Quartz没有把任务故障转移到另一个实例上?
- 如何确保当一个实例宕机时,任务能在剩下的活跃节点上继续执行?
- 在Docker化的Spring Boot环境中,是否还需要额外配置Quartz的某些参数才能实现正确的故障转移?
备注:内容来源于stack exchange,提问作者Karim
相关产品推荐
相关产品推荐

