如何不执行超过预定时间的作业

时间:2017-02-15 10:34:02

标签: java quartz-scheduler

我发现通常在午夜安排的工作(但由于服务器进入节能模式而无法执行)会在服务器退出节能模式后执行。这会导致意外的执行时间。

有没有办法告诉Quartz在远离目标时间之后不执行作业?

1 个答案:

答案 0 :(得分: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