重复间隔不能为零

时间:2014-01-13 21:27:08

标签: java quartz-scheduler

我正在努力将Quartz从1.8.6升级到2.2.1。

在前面的代码中,我们创建了一个类似的触发器:

Trigger trigger = TriggerUtils.makeImmediateTrigger(0, 0);

这是以前有效的语法。但是,自Quartz 2以来,他们转而使用基于构建器的系统。以下是我认为会完成相同的事情,但是,我收到错误Repeat Interval Cannot Be Zero

Trigger trigger = newTrigger()
        .withIdentity(getImmediateTriggerName(jobInfo))
        .forJob(job)
        .withSchedule(simpleSchedule()
            .withIntervalInMilliseconds(0)
            .withRepeatCount(-1))
        .build();

显然这不起作用,所以我想知道完成我们以前做过的同样事情的最佳方法是什么。

由于

3 个答案:

答案 0 :(得分:1)

您似乎只想触发一次。

根据Quartz 1.8 source,调用TriggerUtils.makeImmediateTrigger(0, 0)会创建一个重复计数为0且重复间隔为0的SimpleTrigger。根据Quartz 1.8 tutorial,示例1,这会创建一个触发器只发射一次。因此,这似乎是您的Quartz 1.8代码所做的。

来自Quartz 2.2 TriggerBuilder API documentation

  

[If]你没有调用 withSchedule(..)方法,将立即使用一次默认的触发计划。

所以,看起来您需要做的就是从触发器中删除withSchedule部分:

Trigger trigger = newTrigger()
        .withIdentity(getImmediateTriggerName(jobInfo))
        .forJob(job)
        .build();

我很欣赏Quartz 1.8文档并不完全清楚重复计数。 documentation for the Quartz 2.2 ScheduleBuilder在这一点上要清楚得多:重复计数不包括第一次射击。尽管看到你的代码试图将重复计数设置为-1,但我无法相信你真的希望触发器永远不会触发,如triggers are automatically deleted after they have repeated the required number of times,并且创建触发器只是为了立即删除它是没有意义的没有它射击。实际上,如果将重复间隔设置为正数毫秒并将重复计数保留为-1,you would get an error about the repeat count being negative

答案 1 :(得分:0)

您也可以通过此触发器延迟启动作业

Trigger jobTrigger = TriggerBuilder.newTrigger()
            .withIdentity(jobname, groupName)
            .startAt(new Date(System.currentTimeMillis() + startInterval * 1000L) )
            .build();

这种方式触发器会延迟,但作业不会重复

如果不需要延迟启动

Trigger jobTrigger = TriggerBuilder.newTrigger()
            .withIdentity(jobname, groupName)
            .build();

会做

答案 2 :(得分:0)

这里的问题非常明确。在我遇到同样的问题并解决之后,我能够得出这个结论。

这是问题所在。

Trigger trigger = newTrigger()
    .withIdentity(getImmediateTriggerName(jobInfo))
    .forJob(job)
    .withSchedule(simpleSchedule()
        .withIntervalInMilliseconds(0)
        .withRepeatCount(-1))
    .build();

问题在于 .withIntervalInMilliseconds(0)             .withRepeatCount(-1)因为无法将Interval指定为零。只需使用simpleSchedule(),默认情况下只触发一次。

以下列方式使用,

Trigger trigger = newTrigger()
        .withIdentity(getImmediateTriggerName(jobInfo))
        .forJob(job)
        .withSchedule(simpleSchedule())
        .build();