【问题标题】:about misfire in quartz -scheduler关于石英调度器中的失火
【发布时间】:2013-06-07 11:39:06
【问题描述】:

我正在使用 quart 库在 java 中进行调度。我写了一个这样的触发器

trigger = newTrigger().withIdentity("myTrigger", "myGroup").startNow() .withSchedule(cronSchedule(croneExpression).withMisfireHandlingInstructionFireAndProceed()) .forJob("myJob","myGroup") .build();

现在,当我使用动态生成的 cronexpression 设置调度程序时,调度程序可以正常运行。但是,在调度程序设置为触发期间服务器关闭时,quartz_trigger 中的值,即表中的 next_fire_time 在作业执行时间后更改。因此,调度程序的失火不起作用。所以我的目的没有解决。那么可能是什么问题?是要设置的quartz.properties 中的任何属性。我没有使用 job.xml(jobInitializer) 来设置调度程序。

【问题讨论】:

    标签: java quartz-scheduler


    【解决方案1】:

    quartz_trigger 中的值,即表中的 next_fire_time 在作业执行>时间后发生变化

    是的,这实际上是石英在发生失火时所做的。

    根据创建触发器时提供的 misfire 指令,quartz 计算必须执行的 misfire 执行的次数。 根据您的代码,您已将失火指令设置为“fireAndProceed”,因此 Quartz 只执行第一个失火执行(并忽略所有后续剩余的失火)。例如:如果您将触发器设置为在下午 2 点到下午 4 点之间以 30 分钟的间隔触发,并且如果调度程序在下午 2:29 到下午 3.29 期间关闭,那么只有一个触发器执行时间为下午 2.30 将被执行(并且 3.pm 的执行将被忽略)。

    希望这能回答您的问题。 :-)

    【讨论】:

    • 所以我应该使用 withMisfireHandlingInstructionIgnoreMisfires() 函数来运行调度程序以防失火。
    • 这取决于您的要求。如果您想忽略失火,请使用忽略指令。如果您想执行第一次执行,请使用您使用的另一个。
    • 谢谢先生的回答。我希望调度程序应在服务器启动后立即执行失火,该服务器在调度程序计划触发期间关闭。那么我应该使用哪种方法或设置?
    • 为此,如果使用 cron 触发器,您只能选择 withMisfireHandlingInstructionFireAndProceed()。 (注意它不会执行除第一次之外的所有失火)
    • 我通过在 crontrigger 上调用 withMisfireHandlingInstructionFireAndProceed() 让我的调度程序工作于失火。谢谢先生。
    猜你喜欢
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多