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

时间:2013-09-12 16:13:38

标签: java quartz-scheduler

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

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

我已经探索了两个相似但不完全正在寻找的选项:

  1. 在refireImmediately设置为true的情况下抛出JobExecutionException: 工作,但不会延迟基于失火政策的执行;这个 会破坏资源可用性检查。
  2. 在某个固定的时间间隔内安排第二个触发器 未来:也有效,但没有考虑到失火政策。 这意味着一份工作可能会排队等待一堆重试 来自不同的失败运行。
  3. 我缺少任何想法或任何东西?谢谢!

1 个答案:

答案 0 :(得分:0)

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

失火存在,并由Quartz管理,以防止服务器关闭或其他“意外问题”阻止作业执行。

您可以通过两个选项来实现简单的容错重试逻辑;  当底层资源可用时,您的Job可以执行逻辑 ,因此您可以:

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

  2. 如果资源不可用,则不执行任何操作:
    • 在这种情况下,作业结束而不做任何事情,它将正常触发并根据触发器定义重试。
  3. 在这两种情况下,如果资源是可用的,Job可以执行它的内部逻辑并使用底层资源。 (没有失火,因为工作实际上已被执行)

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


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

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

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

    3. 来删除作业
    4. 第一次您的作业内部逻辑执行(即资源可用)您的作业将保存“作业执行标志”,其中包含在DB上某处执行的日期。

    5. 在下面的触发器执行中,Job将检查该标志,并且不会再次执行它的内部逻辑。


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

      @DisableConcurrentExecution
      

      有关作业执行的更多信息,请参阅Quartz tutorials