2014-12-08 34 views
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 

回答

0

我如何石英调度器更早识别错过的工作吗?

根据docs,这是由org.quartz.jobStore.misfireThreshold财产控制。尝试将它设置为一个较低的值,看看它是否有帮助...

+0

可能,org.quartz.jobStore.misfireThreshold是时间“之前被认为是'失火'”没有解释为什么需要两天,当在属性文件设置为org.quartz.jobStore.misfireThreshold = 600000。 我们认为这个问题可能是我们针对一个数据库运行了两个集群应用程序服务器。我们已经建立了集群,我们将等待,看看是否会再次发生。 – CaliginousPierson 2014-12-17 00:44:02