2017-02-15 69 views
1

我观察到,在服务器退出节能模式后,正常计划在午夜(但无法执行,因为服务器进入节能模式)的作业得到执行。这会导致意外的执行时间。如何不执行超出预定时间的作业

有没有办法告诉Quartz在他们的目标时间太远后不能执行任务?

回答

1

是的。您只需告诉Quartz该怎么做job misfires

触发器的另一个重要属性是它的“失火指令”。如果由于调度程序正在关闭而导致持续触发器“遗漏”其触发时间,或者Quartz的线程池中没有可用的线程来执行作业,则会发生失火。不同的触发类型可以使用不同的失火指令。默认情况下,他们使用“智能策略”指令 - 它具有基于触发类型和配置的动态行为。当调度程序启动时,它会搜索任何发生故障的持续触发器,然后根据各自配置的失火指令更新每个触发器。当你开始在自己的项目中使用Quartz时,你应该让自己熟悉在给定触发器类型上定义的失火指令,并在他们的JavaDoc中进行解释。

具体失火指令取决于您使用的Trigger类型。对于每天的工作这可能是这样的:

trigger = newTrigger() 
     .withIdentity("trigger1", "group1") 
     .withSchedule(dailyAtHourAndMinute(0,0) 
       .withMisfireHandlingInstructionDoNothing()) // set misfire instruction 
     .build(); 

但同样,这取决于触发器的类型。只需使用IDE来查看withMisfire*()方法是否可用,并使用withMisfireHandlingInstructionDoNothingwithMisfireHandlingInstructionNextWithRemainingCount(都将忽略错过的执行并等待下一个预定的方法)。

当我必须了解不同类型的失火指令时,除Quartz的教程和API文档外,我还使用了this blog entry

+0

谢谢!我使用CronTrigger像这样'TriggerBuilder.newTrigger()。withSchedule(CronScheduleBuilder.cronSchedule(cronSchedule).withMisfireHandlingInstructionDoNothing())。build();'。我会看看是否能解决我的问题,但我很有信心。 –

+0

@MartinFernau它怎么样了? – walen

+0

看起来不错。今天的测试表明,这些工作不再被执行。谢谢! –