当前位置: 首页 > 面试题库 >

Quartz Java恢复作业会执行多次

呼延才
2023-03-14
问题内容

对于我的应用程序,我创建作业并使用CronTriggers计划它们。每个作业只有一个触发器,并且作业名称和触发器名称都相同。没有作业共享触发器。

现在,当我创建像这样的cron触发器 “ 0/1 * * 吗?” 它指示作业每秒钟执行一次,效果很好。

当我第一次通过以下方式暂停工作时,问题就出现了:

scheduler.pauseJob(jobName, jobGroup);

然后假设50秒后恢复工作:

scheduler.resumeJob(jobName, jobGroup);

我看到的是,在这50秒钟中,作业没有按要求执行。但是当我恢复工作的那一刻,我看到同时执行了50次工作!!!

我以为这是由于不触发指令的默认设置引起的,但即使在创建触发器时将触发器的不触发指令设置为此:

trigger.setMisfireInstructhtml" target="_blank">ion(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);

发生同样的事情。谁能建议解决此问题的方法?


问题答案:

CronTrigger通过记住的作品nextFireTime。创建触发器后,将对其nextFireTime进行初始化。每次触发作业nextFireTime都会更新。由于暂停时未触发作业,因此nextFireTime保持“旧”状态。因此,恢复作业后,触发器将返回每个旧的触发器时间。

问题是,触发器不知道它已被暂停。为了克服这个问题,进行了不点火处理。恢复作业后,updateAfterMisfire()将调用触发器的方法来更正nextFireTime。但是,如果nextFireTime和现在之间的差小于misfireThreshold,则不是这样。这样就永远不会调用该方法。此阈值的默认值为60,000。因此,如果您的暂停时间超过60s,一切都会好起来的。

由于您有问题,我认为没有。;)要解决此问题,您可以修改阈值或在周围使用简单的包装器CronTrigger

public class PauseAwareCronTrigger extends CronTrigger {
    // constructors you need go here

    @Override
    public Date getNextFireTime() {
        Date nextFireTime = super.getNextFireTime();
        if (nextFireTime.getTime() < System.currentTimeMillis()) {
            // next fire time after now
            nextFireTime = super.getFireTimeAfter(null);
            super.setNextFireTime(nextFireTime);
        }
        return nextFireTime;
    }
}


 类似资料:
  • 使用spring 2.5和quartz 1.6.2,我一直试图每分钟触发一个计划任务 我的xml文件是: 我的代码是:

  • 我有这份工作: 作业应该每小时运行一次。我以为问题是cronexpression。这就是为什么我把它改成上面的表达式。在我有这个表达之前: null

  • 我正在使用一个火花流作业,它使用带有初始RDD的mapAnd State。当重新启动应用程序并从检查点恢复时,它会失败,出错: 此RDD缺少SparkContext。它可能发生在以下情况: RDD转换和操作不是由驱动程序调用的,而是在其他转换内部调用的;例如,rdd1.map(x= 中描述了此行为https://issues.apache.org/jira/browse/SPARK-13758但它

  • 如何将CronTimer迭代器设置为1?或者如何停止排定程序多次执行作业。 有什么建议吗?谢谢,古扬·沙阿。

  • 公共静态空main(String[]args)抛出异常{ 最终StreamExecutionEnvironment env=StreamExecutionEnvironment。getExecutionEnvironment();环境。setRuntimeMode(RuntimeExecutionMode.BATCH); } 哪个节点执行逻辑,例如上面的ftpUri定义。 我尝试用断点将调试器附加

  • 问题内容: 我正在测试詹金斯,看它是否适合我们的构建和测试框架。我发现Jenkins及其可用的插件可以满足我们的大多数需求。除了我似乎无法找到有关如何执行一种特定类型任务的帮助。 我们正在为嵌入式设备创建应用程序。我们需要在这些设备上运行100项测试。如果我们在构建后在一台设备上运行所有测试,那么将需要几个小时才能获得结果。但是,如果我们在100个设备上并行运行测试,则可以在更短的时间内获得结果。