1. 簡介
Spring Scheduling 庫允許應用程序在特定時間間隔內執行代碼。由於時間間隔的指定使用了 @Scheduled 註解,這些時間間隔通常是靜態的,並且在應用程序的整個生命週期內無法更改。
在本教程中,我們將探討各種條件啓用 Spring 計劃任務的方法。
2. 使用布爾標誌
使用布爾標誌是最簡單的方法來條件啓用 Spring 計劃任務。我們可以檢查這個布爾變量,並在計劃任務內部進行。這個變量可以使用 @Value 註解,以便使用正常的 Spring 配置機制進行配置:
@Configuration
@EnableScheduling
public class ScheduledJobs {
@Value("${jobs.enabled:true}")
private boolean isEnabled;
@Scheduled(fixedDelay = 60000)
public void cleanTempDirectory() {
if(isEnabled) {
// do work here
}
}
}缺點在於 該計劃任務始終由 Spring 執行,這在某些情況下可能不是最佳選擇。
3. 使用 @ConditionalOnProperty
另一個選項是使用 @ConditionalOnProperty 註解。它接受一個 Spring 屬性名稱,並在該屬性評估結果為 true 時運行。
首先,我們創建一個新的類來封裝定時任務代碼,包括調度間隔:
public class ScheduledJob {
@Scheduled(fixedDelay = 60000)
public void cleanTempDir() {
// do work here
}
}然後,我們根據條件創建該類型的 Bean:
@Configuration
@EnableScheduling
public class ScheduledJobs {
@Bean
@ConditionalOnProperty(value = "jobs.enabled", matchIfMissing = true, havingValue = "true")
public ScheduledJob scheduledJob() {
return new ScheduledJob();
}
}在這種情況下,該任務將運行,如果屬性 jobs.enabled 設置為 true,或者如果該屬性不存在,則會運行。 缺點是,此註解僅在 Spring Boot 中可用。
4. 使用 Spring 配置文件
我們可以根據應用程序運行的配置文件來條件啓用 Spring 計劃任務。例如,這種方法在任務僅應在生產環境中進行調度時非常有用。
這種方法在調度在所有環境中保持相同,並且僅需要在特定配置文件中禁用或啓用時效果良好。
這與使用 <em @ConditionalOnProperty</em>> 類似,只是我們使用 <em @Profile</em>> 註解在 bean 方法上:
@Profile("prod")
@Bean
public ScheduledJob scheduledJob() {
return new ScheduledJob();
}這將僅在 prod 配置文件處於啓用狀態時創建該任務。 此外,它還提供了與 @Profile 註解一起使用的完整選項集:匹配多個配置文件、複雜的 Spring 表達式以及更多。
需要注意的是,如果未指定任何配置文件,則 bean 方法仍將被執行。
5. Cron 表達式中的 Value 佔位符
使用 Spring value 佔位符,不僅可以條件啓用一個任務,還可以更改其調度計劃。
@Scheduled(cron = "${jobs.cronSchedule:-}")
public void cleanTempDirectory() {
// do work here
}在此示例中,該任務默認被禁用(使用特殊 Spring cron 禁用表達式)。
如果我們想啓用該任務,我們只需要為 jobs.cronSchedule 提供一個有效的 cron 表達式。 就像任何其他 Spring 配置一樣,我們可以這樣做:命令行參數、環境變量、屬性文件等等。
與 cron 表達式不同,無法設置固定延遲或固定速率值來禁用任務。 因此 這種方法僅適用於 cron 計劃任務。
6. 結論
在本教程中,我們瞭解到有多種不同的方法可以條件啓用 Spring 計劃任務。 某些方法比其他方法更簡單,但可能存在侷限性。