2016-01-22 23 views
6

我有一個定期運行一個春天預定方法:如何通過屬性文件禁用@Scheduled方法?

@Scheduled(cron = "${spring.cron.expression}") 
public void demonJob() throws .. { .. } 

cron表達式被成功地從application.properties閱讀:

spring.cron.expression=0 0 * * * * 

現在,我要部署應用到一個特殊的環境中這個特定的Scheduled方法不應該運行。如果我離開cron的財產空這樣的..

spring.cron.expression= 

..我得到下面的異常:

Encountered invalid @Scheduled method 'demonJob': Cron expression must consist of 6 fields (found 0 in "") 

我怎樣才能優雅地禁用,預定的方法,最好只提供不同的設置application.properties

+0

如果你想這樣做,這個話題是關於「永遠不會執行cron表達式」:http://stackoverflow.com/questions/13835221/quartz-cron-expression-that-will-never-execute – Berger

+0

@ Berger,但是這個問題涉及石英cron表達式,這些表達式似乎比spring cron表達式更靈活。 –

回答

5

空字符串是不正確的cron表達式。如果您想在特定條件下禁用調度程序,則只需使用@Profile註釋,或者如果您必須使用Spring Boot的屬性操作@ConditionalOnProperty註釋。

@Component 
@ConditionalOnProperty(prefix = "spring.cron", name = "expression") 
public class MyScheduler { 
    @Scheduled(cron = "${spring.cron.expression}") 
    public void demonJob() throws .. { .. } 
} 
+0

ConditionalOnProperty看起來像一個很酷的解決方案 - 不幸的是這不是一個Spring Boot項目。配置文件解決方案將要求我們添加所有需要調度程序的配置文件,但我們寧願僅針對一個特定配置文件禁用它。 –

+0

你可以很簡單地自己實現@ConditionalOnProperty。這是5行的條件類 –

0

可能的解決你的問題

  1. 配置屬性文件基於環境
  2. 根據您的環境配置文件配置您的ApplicationContext。
  3. 使用環境特定的CRON條目。
  4. 請檢查這個link哪些可以幫到你。
0

我可以給出另一種方法。只需以任何方式重新定義applicatino cron表達式即可設置無法訪問的時間段。例如。 spring.cron.expression=1 1 1 1 1 ?(這是我在我的代碼中使用,它對我來說已經足夠了)。

這種方法的好處是您不必在代碼中做任何其他更改。

+1

1月1日1:01:01不是你的例子嗎?這看起來不像「從不」。或者您是否假設在該日期之前更改日程安排以避免執行?你能否詳細解釋一下? –

+0

你說得對。我只是想設置無法訪問的調度程序。這個表達式適用於我的代碼(是的,我認爲它將每年運行一次)。但我想給出一個解決這個問題的方法(例如,你可以設定兩年內的一個時刻) –