3
我正在調查使用@Scheduled在固定的速度,其中在一些可配置情況下,應該永遠不會運行計劃的工作。是否可以將@Scheduled分配給代表「never」的句子(在Spring中)?
該文檔未提及此,但fixedDelay()
和fixedDelayString()
的默認值分別爲-1
和""
。這些可以用來可靠地確保預定的方法不會觸發嗎?
我正在調查使用@Scheduled在固定的速度,其中在一些可配置情況下,應該永遠不會運行計劃的工作。是否可以將@Scheduled分配給代表「never」的句子(在Spring中)?
該文檔未提及此,但fixedDelay()
和fixedDelayString()
的默認值分別爲-1
和""
。這些可以用來可靠地確保預定的方法不會觸發嗎?
你不能。當您設置fixedDelay
屬性-1
或試圖使用@Scheduled
不指定任何屬性的有效值,春天會抱怨沒有屬性設置:
完全
'cron'
,'fixedDelay(String)'
,或'fixedRate(String)'
屬性之一是要求
您可以通過檢查ScheduledAnnotationBeanPostProcessor#processScheduled
的源代碼來驗證此行爲。
它包含諸如邏輯:
boolean processScheduled = false;
// ...
if (fixedRate >= 0) {
Assert.isTrue(!processedSchedule, errorMessage);
processedSchedule = true;
this.registrar.addFixedRateTask(new IntervalTask(runnable, fixedRate, initialDelay));
}
// ...
Assert.isTrue(processedSchedule, errorMessage);
看看這個SO post一些選項有條件禁止@Scheduled
。
哦,這是一個恥辱 - 感謝您的調查。我猜想在鏈接的文章中沒有提到的一種可能的解決方法可能是爲'initialDelay'和'fixedDelay'設置非常高的值(即最大'long')值,以免它們實際到達。這可能在實踐中有效,但似乎有點不妥,不得不訴諸於此,而且Spring並沒有提供「從不」的選擇。 –
@SteveChambers是的,這似乎有點破解。另外,如果您要從配置中檢索值並使用'fixedDelayStr'進行設置,則將使用'Integer.parseInt'而不是'Long.parseLong'進行解析,因此將其設置爲long的最大值將會失敗:) ...稍後我會在Spring JIRA上報告它。 –
哦,親愛的,看起來'fixedDelayStr'對於這種方法來說是不可能的,那麼最大整數是2147483647,如果我的谷歌輔助計算是正確的,以毫秒爲單位等於3個半星期 - 292471208年,我認爲'長'會允許! –