2014-01-13 30 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();