当前位置: 首页 > 知识库问答 >
问题:

数据库连接失败时重试Quartz调度程序启动

郑卜鹰
2023-03-14

我们有一个Java应用程序,它使用Quartz来调度作业。我们使用的quartz版本是:Quartz-2.2.1

quartz配置使用JDBC作业存储。

如果在quartz scheduler对象上调用start方法时数据库连接关闭(由于断断续续的网络故障),它将以以下异常失败:

2017-05-28 00:05:45 org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.JobPersistenceException: Couldn't recover jobs: The connection is closed. [See nested exception: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.]]
2017-05-28 00:05:45     at org.quartz.impl.jdbcjobstore.JobStoreSupport.schedulerStarted(JobStoreSupport.java:692)
2017-05-28 00:05:45     at org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:567)
2017-05-28 00:05:45     at org.quartz.impl.StdScheduler.start(StdScheduler.java:142)

为了确保quartz scheduler成功启动,我们在代码中添加了重试,它在每1秒后调用quartz scheduler对象上的start方法。但是,当数据库连接打开时,对quartz scheduler start方法的调用是成功的(它不会引发任何异常)--但是驻留在数据库中的相关触发器不会启动,也不会触发任何作业。

这里是quartz的配置,请注意我们已经启用了验证查询来处理糟糕的连接(由于间歇性网络故障)

#============================================================================
# Configure Main Scheduler Properties  
#============================================================================

org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.skipUpdateCheck=true

#============================================================================
# Configure ThreadPool  
#============================================================================

org.quartz.threadPool.class =     org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount =  50
org.quartz.threadPool.threadPriority = 5

#============================================================================
# Configure JobStore  
#============================================================================

org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.maxMisfiresToHandleAtATime = 15

org.quartz.jobStore.class =     org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass =     org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = aBPM
org.quartz.jobStore.tablePrefix = ABPM_
org.quartz.jobStore.isClustered = false
org.quartz.jobStore.useDBLocks = false
org.quartz.jobStore.acquireTriggersWithinLock = true

#============================================================================
# Configure Datasources  
#============================================================================
org.quartz.dataSource.aBPM.driver = org.hsqldb.jdbcDriver
org.quartz.dataSource.aBPM.URL = jdbc:hsqldb:file:embeddedDb/db/abpmquartz
org.quartz.dataSource.aBPM.user = sa
org.quartz.dataSource.aBPM.encryptPassword = yes
org.quartz.dataSource.aBPM.password = fMFVvEFk3gFmM9ewWQkTNg==
org.quartz.dataSource.aBPM.maxConnections = 55
org.quartz.dataSource.aBPM.validationQuery= SELECT 1

共有1个答案

燕昊东
2023-03-14

你可能有工作失败的问题。

TL;DR:在构建触发器时使用适当的misfire指令,或者增加misfire阈值

如果在触发器应该触发的时候调度器关闭了,那就是无效触发。一旦调度器启动,Quartz就会检查错误的作业,并寻找如何处理它们的指示。马上运行它们?等到他们下一次预定的开火时间?为了让它知道要做什么,您可以通过使用misfire指令来明确表示,或者直接默认使用Quartz的smart策略,这取决于触发器类型(例如,CronTrigger具有不同于SimpleTrigger的默认misfire策略)。

另一个选项是将org.quartz.jobstore.misfirethreshold设置为高于调度程序启动所需的值。
现在将其设置为1分钟。这意味着,任何比预期发射时间晚1分钟的作业,都不会被认为是无效发射,并将正常运行。然而,对于迟到超过1分钟的工作,Quartz将为他们检查不匹配政策。

说你知道调度器总是不到5分钟就上线;然后,您可以尝试设置org.Quartz.jobstore.misfirethreshold=3000000,这样,当调度器启动时作业启动时,Quartz会看到它们迟到了不到5分钟,并会让它们执行,而不首先检查Misfireme策略。

 类似资料:
  • Spring Boot版本为1.5.6 使用的数据库是SQL Server2016,它也是在docker(windows容器)上。 问题:每当我重新启动SQL DB容器时,应用程序开始给出这个错误。 任何想法可以做什么来解决这个问题。 多谢了。

  • 我试图连接到我的mongo数据库在我的远程服务器: 但我有一个错误: MongoDB外壳版本:2.6.10连接到:xxx。xxx。xxx。xx:27017/测试2016-11-07T05:18:39.140 0000警告:无法连接到xxx。xxx。xxx。xx:27017,原因:错误号:111连接被拒绝2016-11-07T05:18:39.142 0000错误:无法连接到服务器xxx。xxx。x

  • 语境 我试图使用JDBC在集群模式下使用quartz调度器。 问题 在开始使用集群模式下的jdbc之前,我只是用RAM存储测试了调度器。这没有问题,我能够重新启动调度程序(主类)没有任何错误。我现在遇到的问题是,当我停止执行(CTRL+C)然后重新启动它时,我总是得到错误消息: 我不明白这是怎么回事。quartz不支持重新启动调度程序吗?我的意思是,如果出现崩溃,调度程序在恢复后重新启动会发生什么

  • 我正在使用SQL服务器与Node.js.当连接首次尝试失败时,Node.js不会重新尝试连接。我正在使用定期尝试,直到它连接。 上面的代码尝试连接,失败并尝试第二次,但不会继续第三次、第四次等。

  • 问题内容: 我已将Web应用程序部署到远程树脂服务器,并且已打开JMX。 我可以远程登录到远程服务器,即 但是我无法使用我的JConsole连接到它 我已经在以下Java版本中尝试过此操作,但是在两个实例上都收到“连接失败”的提示。 你们对如何调试有任何想法(即找出问题所在)吗? 问题答案: 确保您正在使用以下Java属性集运行应用程序 立即尝试连接。如果要调试此命令,可以使用以下命令运行jcon

  • 错误:无法启动连接:错误:WebSocket无法连接。在服务器上找不到连接,endpoint可能不是信号器endpoint,服务器上不存在连接ID,或者存在阻止WebSocket的代理。如果有多台服务器,请检查是否启用了粘性会话。 WebSocketTransport.js:49WebSocket连接到“ws://xxxxxx/生产/网络服务/集线器/spreadhub”失败: Angular.t