2014-01-13 86 views
0

我正在将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(); 

显然这是行不通的,所以我不知道什么是实现我们以前做同样的事情的最好方法。

谢谢

+0

多少次应触发火灾,0或1?上面的代码表明0,但我看不到创建从不触发的触发器的要点。 –

回答

1

看来你想触发器只触发一次。

按照Quartz 1.8 source,主叫TriggerUtils.makeImmediateTrigger(0, 0)创建具有重复计数0和重复间隔0。根据一个Quartz 1.8 tutorial,例1的SimpleTrigger,这产生一个触发一次的触发器。因此,这似乎是你的Quartz 1.8代码正在做的事情。

Quartz 2.2 TriggerBuilder API documentation

[如果]你不调用withSchedule(..)方法,一旦立即发射将使用默认的计划。

因此,它似乎是所有你需要做的是让您的触发摆脱withSchedule节:

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

我明白,石英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

+0

感谢您的彻底解答。由于我没有看到调用'TriggerUtils.makeImmediateTrigger(0,0)'会创建一次触发的触发器,所以我必须错过1.8文档/教程中的几点。再次感谢。 – joshft91

0

您还可以通过这个触发

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

这样的触发动作与延迟开始有延迟的工作,但工作不重复

如果延迟不需要启动

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

会做

0

的发行H ere非常清楚。在我解决相同问题并解决问题后,我能够完成此声明。

这是问题所在。

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

的问题是与.withIntervalInMilliseconds(0) .withRepeatCount(-1)不能指定时间间隔为零。只需使用simpleSchedule(),默认情况下只触发一次。

以下列方式使用,

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