我们有一个Java应用程序,它使用Quartz来调度作业。我们使用的石英版本是:quartz-2.2.1
quartz配置使用JDBC作业存储。
如果在quartz scheduler对象上调用start方法时数据库连接断开(由于间歇性网络故障),它将失败并出现以下异常:
react-native --version
为了确保石英调度程序成功启动,我们在代码中添加了重试,每隔1秒就调用一次对石英调度程序对象的start方法。但是当数据库连接启动时,对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)
答案 0 :(得分:0)
job misfires可能存在问题。
TL; DR:在构建触发器时使用适当的失火说明,或者增加misfireThreshold
。
如果调度程序在触发器应该触发时发生故障,那就是失败。调度程序启动后,Quartz会检查失误的作业并查找有关如何处理它们的说明。马上运行它们?等到下一次预定的开火时间?
要让它知道该怎么做,你可以使用misfire instructions明确,或者只是默认使用Quartz的智能策略,这取决于触发类型(例如CronTrigger
与SimpleTrigger
不同的默认失火政策。
可悲的是,Quartz的烹饪手册在解释失火指令方面有点缺乏,并且如果您想了解更多,请告诉您检查每个Trigger
子类的JavaDoc。
因此,为了您的方便,这个人用all misfire instructions and default misfire policies explained写了一篇博客文章。
您没有告诉我们您使用的是什么类型的触发器,但您可能希望包含withMisfireHandlingInstructionFireNow()
之类的失火指令,这些指令会在调度程序执行后立即运行起来。
另一种选择是将org.quartz.jobStore.misfireThreshold
设置为比调度程序启动时更高的值。
现在你把它设置为1分钟。这意味着任何射击少于的作业比预期的射击时间晚1分钟,不会被视为失火,并且运行得很好。但是,对于迟到超过1分钟的工作,Quartz将检查他们的失火政策。
假设您知道调度程序总是需要不到5分钟的时间上线;然后你可以尝试设置org.quartz.jobStore.misfireThreshold = 300000
,所以当在调度程序启动时启动作业时,Quartz会发现它们迟到的时间不到5分钟,只是让它们执行而不先检查失火策略。