2017-07-18 49 views
1

我想在java中運行一個cron,它將每天運行x個小時。 X將由數據庫中的一個非靜態值決定。我想是這樣的:cron中的表達式

private static String cronRunTime = getCronRunTimeFromDb(); 
private String cronExpression = "* " + cronRunTime + " * * *"; 

但我面臨的主要問題是,我沒有得到我怎麼可以配置在@Scheduled註釋此值。

我試過的東西:

@Scheduled(cron = cronExpression) 
    public void myCron(){ 

    } 

但是在編譯過程中,我得到一個錯誤:

error: element value must be a constant expression 
    @Scheduled(cron = cronExpression) 

能有人幫我解決這個問題。

+0

你對問題「爲什麼我得到一個編譯器錯誤?」或者更多關於「如何根據數據庫中的信息配置cron表達式計劃任務?」 –

+0

我的問題是「如何根據數據庫中的信息配置cron表達式計劃任務」 –

+0

我在下面的答案中提供了2個選項:使用Java代碼和以編程方式配置任務(使用Spring),以及使用'@ Scheduled'註釋的聲明方式和Spring的佔位符功能。您也可以刪除Spring方法,並簡單地使用純JDK功能來運行計劃任務:'ExecutorService'等。 –

回答

0

「秒分鐘小時日月平日」

「0 0 *?* *」 爲每天每時cron表達式。
「0 0 10?* *」是每天早上10點的cron表達式。

你要找的內容與每一個 「X」 個小時,每天將是:

「?0 0 */X *。*」

希望有所幫助。

1

根據Java specification基元類型和String註釋元素的值必須是constant expressions - 可以在編譯時評估,而不是在運行時評估。

簡而言之:你不能傳遞給註釋屬性,它在運行時計算的值(從數據庫中提取,從屬性文件讀取,或者甚至像System.currentTimeMillis()靜態函數返回)。如果你有一個動態

您的計劃任務的邏輯取決於某種配置(在數據庫或屬性文件中),您應該考慮使用ScheduledTaskRegistrar及其addCronTask(CronTask task)方法,這當然不像簡單的註釋那麼簡潔。

見例如如何使用ScheduledTaskRegistrar之間的反應在這裏:因爲它已經被描述

作爲替代方案,你可以使用屬性佔位符邏輯來填充屬性@Scheduled註釋cron在其他問題中:

你甚至可以讓Spring來,如果你真的要去野生讀取數據庫屬性,請參見: