gpt4 book ai didi

java - 有没有办法在 Quartz 中模拟触发器失火? ( java )

转载 作者:行者123 更新时间:2023-12-02 07:32:05 27 4
gpt4 key购买 nike

我正在寻找一种以编程方式模拟或强制触发器失火的方法。这是场景:

我有一个要触发的作业,但该作业需要一些有时可能不可用的底层资源。如果资源不可用,我希望 Quartz 稍后根据失火策略重新触发触发器。

我探索了两个相似但不完全是我想要的选项:

  1. 抛出 JobExecutionException 并将 refireImmediately 设置为 true:有效,但不会根据失火策略延迟执行;这将进行资源可用性检查。
  2. 在某个固定时间间隔安排第二次触发future:也可以,但不考虑失火政策。这意味着一项工作可能会因大量排队重试而结束源于不同的失败运行。

有什么想法或我缺少的东西吗?谢谢!

最佳答案

如果我做对了,您不需要强制或模拟失火,因为资源可用性是“您的作业可以处理的东西”。

Misfires 存在,并由 Quartz 管理,以应对服务器关闭或其他阻止作业执行的“意外问题”等情况。

您可以遵循两个选项来实现简单的容错重试逻辑; 您的作业当底层资源可用时才能执行其逻辑,因此您可以:

  1. 等待资源变得可用:
    • 在这种情况下,您的作业等待并重复检查资源可用性,最终在短暂的超时后,作业可以放弃并结束。

  2. 如果资源不可用,则不执行任何操作:
    • 在这种情况下,作业结束时不会执行任何操作,并且它将正常触发并根据触发器定义重试。

在这两种情况下,如果资源可用,则作业可以执行其内部逻辑并使用底层资源。 (没有失火,因为作业实际上被执行了)

这可以使用触发器来完成,设置您需要的失火策略,以防作业根本无法执行。看到这个伟大而详细的article关于 quartz 失火。

<小时/>

在您的情况下,如果您想每天执行一次作业:

  1. 定义一个 Cron 触发器,在一天内的给定时间段内多次触发,例如,从上午 8:00 到凌晨 12:00 每 15 分钟触发一次:

    0 0/15 8-12 * * ?
  2. 使用前面描述的两种方法之一构建作业

  3. 您的作业内部逻辑第一次执行(即资源可用)时,您的作业将在数据库的某处保存一个“作业执行标志”以及执行日期。

在接下来的触发器执行中,作业将检查该标志,并且不会再次执行其内部逻辑。

<小时/>

此外,如果您的作业需要很长时间才能完成,您可能希望在作业实现上使用以下注释来防止同一作业的并发执行:

@DisableConcurrentExecution

参见 quartz tutorials有关作业执行的更多信息。

关于java - 有没有办法在 Quartz 中模拟触发器失火? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18769381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com