0
如何让Quartz调度程序提前识别错过的作业?石英调度程序需要两天时间来识别失火作业
工作本来是在在被解雇2014年5月12日08:00:00.000但只在2014-12-07 23查明:34:15800
2014-12-07 23:34:15,800 INFO [QuartzScheduler_sharedQuartzScheduler-NON_CLUSTERED_MisfireHandler] [,,] [org.quartz.plugins.history.LoggingTriggerHistoryPlugin] Trigger [expiryBreachTrigger.11854] misfired job [Breach.11854]. Should have fired at: 05-12-2014 08:00:00.000
2014-12-07 23:34:15,825 INFO [sharedQuartzScheduler_Worker-40] [,,] [org.quartz.plugins.history.LoggingTriggerHistoryPlugin] Trigger [expiryBreachTrigger.11854] fired job [Breach.11854] scheduled at: 07-12-2014 23:34:15.801, next scheduled at: null
2014-12-07 23:34:15,844 ERROR [sharedQuartzScheduler_Worker-40] [,,] [nz.co.chorus.com.om.service.service.impl.JeopardyManagementServiceImpl] An error occurred while scheduling expiration job for event id 11854: org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'Breach.11854', because one already exists with this identification.
2014-12-07 23:34:15,846 INFO [sharedQuartzScheduler_Worker-40] [,,] [org.quartz.plugins.history.LoggingTriggerHistoryPlugin] Trigger [expiryBreachTrigger.11854] completed firing job [Breach.11854] with resulting trigger instruction code: RE-EXECUTE JOB. Next scheduled at: null
2014-12-07 23:34:15,846 INFO [sharedQuartzScheduler_Worker-40] [,,] [org.quartz.plugins.history.LoggingTriggerHistoryPlugin] Trigger [expiryBreachTrigger.11854] fired job [Breach.11854] scheduled at: 07-12-2014 23:34:15.801, next scheduled at: null
2014-12-07 23:34:15,846 INFO [sharedQuartzScheduler_Worker-40] [,,] [org.quartz.plugins.history.LoggingJobHistoryPlugin] Job [Breach.11854] to be fired by trigger [expiryBreachTrigger.11854], re-fire: 1
2014-12-07 23:34:15,846 DEBUG [sharedQuartzScheduler_Worker-40] [,,] [org.quartz.core.JobRunShell] Calling execute on job Breach.11854
2014-12-07 23:34:15,855 INFO [eventLoggerContainer-1] [,,] [nz.co.chorus.com.event.listener.EventLoggerListener] Event Logger: null
2014-12-07 23:34:15,859 INFO [sharedQuartzScheduler_Worker-40] [,,] [org.quartz.plugins.history.LoggingJobHistoryPlugin] Job [Breach.11854] execution complete and reports: null
2014-12-07 23:34:15,859 INFO [sharedQuartzScheduler_Worker-40] [,,] [org.quartz.plugins.history.LoggingTriggerHistoryPlugin] Trigger [expiryBreachTrigger.11854] completed firing job [Breach.11854] with resulting trigger instruction code: DELETE TRIGGER. Next scheduled at: null
一旦该作业被识别为错误的作业,但它被正确地重新排定,但正如您所看到的,存在例外,ObjectAlreadyExistsException但这会导致触发器指令重新执行作业,然后作业运行正常。
问题是二两三天识别该错过的任务是太长期
final Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity(Objects.toString(jeopardyEventId),
"expiry" + jobGroup + "Trigger")
.startAt(expirationTime).build();
也许我需要建立触发与失火指令
.withMisfireHandlingInstructionIgnoreMisfires()
,但我的理解这只是意味着当它被发现时,它会一直运行这项工作,而不会咨询智能策略。
quartz.properties文件
org.quartz.plugin.triggerHistory.class=org.quartz.plugins.history.LoggingTriggerHistoryPlugin
org.quartz.plugin.triggerHistory.triggerFiredMessage=Trigger [{1}.{0}] fired job [{6}.{5}] scheduled at: {2, date, dd-MM-yyyy HH:mm:ss.SSS}, next scheduled at: {3, date, dd-MM-yyyy HH:mm:ss.SSS}
org.quartz.plugin.triggerHistory.triggerCompleteMessage=Trigger [{1}.{0}] completed firing job [{6}.{5}] with resulting trigger instruction code: {9}. Next scheduled at: {3, date, dd-MM-yyyy HH:mm:ss.SSS}
org.quartz.plugin.triggerHistory.triggerMisfiredMessage=Trigger [{1}.{0}] misfired job [{6}.{5}]. Should have fired at: {3, date, dd-MM-yyyy HH:mm:ss.SSS}
org.quartz.plugin.jobHistory.class=org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobHistory.jobToBeFiredMessage=Job [{1}.{0}] to be fired by trigger [{4}.{3}], re-fire: {7}
org.quartz.plugin.jobHistory.jobSuccessMessage=Job [{1}.{0}] execution complete and reports: {8}
org.quartz.plugin.jobHistory.jobFailedMessage=Job [{1}.{0}] execution failed with exception: {8}
org.quartz.plugin.jobHistory.jobWasVetoedMessage=Job [{1}.{0}] was vetoed. It was to be fired by trigger [{4}.{3}] at: {2, date, dd-MM-yyyy HH:mm:ss.SSS}
org.quartz.jobStore.misfireThreshold=600000
org.quartz.threadPool.threadCount=50
org.quartz.scheduler.skipUpdateCheck=true
可能,org.quartz.jobStore.misfireThreshold是时间“之前被认为是'失火'”没有解释为什么需要两天,当在属性文件设置为org.quartz.jobStore.misfireThreshold = 600000。 我们认为这个问题可能是我们针对一个数据库运行了两个集群应用程序服务器。我们已经建立了集群,我们将等待,看看是否会再次发生。 – CaliginousPierson 2014-12-17 00:44:02