簡體   English   中英

在 spring-boot @Scheduled 中使用 fixedDelayString 而不直接放置配置屬性

[英]Using fixedDelayString in spring-boot @Scheduled without putting the configuration property directly

這是我的問題。 我在一些方法之上使用@Scheduled在我的 spring-boot 應用程序中執行一些常規任務。

為了配置計划,我使用fixedDelayStringinitialDelayString arguments 到@Scheduled ,如下所示:

@Scheduled(
      initialDelayString = "${my.wanted.delayInSeconds}",
      fixedDelayString = "${my.wanted.delayInSeconds}"
  )

哪個像它應該的那樣工作。

我現在遇到的問題是,在應用程序的屬性文件中,我必須將配置屬性設置為:

my.wanted.delayInSeconds=10

如果我對 spring 屬性使用任何其他受支持的案例,例如 kebab-case:

my.wanted.delay-in-seconds=10

應用程序無法啟動並出現異常:

Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'myMethod': Could not resolve placeholder 'my.wanted.delayInseconds' in value "${my.wanted.delayInSeconds}"

這是有道理的,因為該值未定義 & spring 似乎沒有對fixedDelayStringinitialDelayString占位符進行轉換。

問題是這似乎很容易破解。 我也在從通常的@ConfigurationProperties class 中讀取相同的屬性。 所以 IntelliJ 一直建議我在屬性文件中使用 kebab-case 版本,即my.wanted.delay-in-seconds 我同意 - 那里更容易閱讀。 但如果我這樣做,應用程序將無法啟動。

所以我的問題是:有沒有辦法

  • 要么,spring 是否進行了通常的轉換,以便 kebab-case 也可以工作?
  • 或者,提供來自配置屬性 class 的延遲字符串,而不是直接使用該屬性?

謝謝!

正如上面@wjans 評論所指出的,實現我想要的正確方法是使用 SEL 從我的屬性 bean 中獲取 bean 屬性並在@Scheduled參數中使用它。

像這樣:

@Scheduled(
      initialDelayString = "#{@myProps.getSchedulingDelayMillis()}",
      fixedDelayString = "#{@myProps.getSchedulingDelayMillis()}"
  )

這將從屬性 class 中提取延遲字符串,因此您可以將所需的任何內容綁定到該屬性並使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM