以單個(gè)數(shù)字開頭的 Java 字符串屬性值(例如,像“0 30 */1 * * ?”這樣的 CRON 計(jì)劃)被截?cái)酁榈谝粋€(gè)數(shù)字。Java 將截?cái)嗳魏我詳?shù)字開頭、后跟空格的屬性值字符串。這個(gè)技巧有一個(gè)帶有 Spring Scheduled 任務(wù)的小項(xiàng)目,它使用 CRON 計(jì)劃來演示問題和解決方案。
簡介
當(dāng)嘗試使用環(huán)境變量參數(shù)化 Spring 任務(wù)的 CRON 計(jì)劃時(shí),我遇到了一個(gè)問題,即未從屬性接收完整計(jì)劃,而僅在第一個(gè)值為數(shù)字的情況下。搜索谷歌給了我零個(gè)我的問題類型的例子,所以我是靠自己的。
我找到的解決方案涉及為計(jì)劃的每個(gè)部分使用單獨(dú)的環(huán)境變量。
使用代碼
附加的基于 Maven 的項(xiàng)目是一個(gè)簡單的項(xiàng)目,其中 Spring 任務(wù)會(huì)將當(dāng)前時(shí)間打印到控制臺(tái)。我使用 Intellij 的 IDEA,但您應(yīng)該能夠?qū)⑵湔{(diào)整到 Eclipse 或您喜歡的任何其他 IDE。
任務(wù)類是:
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(cron ="${cron.schedule}")
public void reportCurrentTime() {
log.info("The time is now {}", dateFormat.format(new Date()));
}
}
在我的 中application.properties
,我最初從單個(gè)環(huán)境變量設(shè)置時(shí)間表:
cron.schedule = ${test_cron}
如果我使用*/5 * * * * ?
環(huán)境變量“ test_cron
”中設(shè)置的“ ”(每 5 秒)的CRON 計(jì)劃運(yùn)行此程序,我會(huì)得到預(yù)期的結(jié)果:
2021-04-29 12:17:50.437 INFO 22420 --- [ main] o.s.s.c.ThreadPoolTaskScheduler
: Initializing ExecutorService 'taskScheduler'
2021-04-29 12:17:50.480 INFO 22420 --- [ main] c.e.s.SchedulingTasksApplication
: Started SchedulingTasksApplication in 2.441 seconds (JVM running for 3.931)
2021-04-29 12:17:55.008 INFO 22420 --- [ scheduling-1] c.e.schedulingtasks.ScheduledTasks
: The time is now 12:17:55
2021-04-29 12:18:00.014 INFO 22420 --- [ scheduling-1] c.e.schedulingtasks.ScheduledTasks
: The time is now 12:18:00
2021-04-29 12:18:05.005 INFO 22420 --- [ scheduling-1] c.e.schedulingtasks.ScheduledTasks
: The time is now 12:18:05
但是,如果我以?“ 0 25 * * * ?”
?(在過去 25 分鐘)的時(shí)間表運(yùn)行它,我會(huì)收到錯(cuò)誤消息,指出我的時(shí)間表無效并且其中只有零:
Encountered invalid @Scheduled method 'reportCurrentTime': For input string: ""0"
為了解決這個(gè)問題,我更改了應(yīng)用程序?qū)傩?,以便?Environment
?每個(gè)計(jì)劃部分使用一個(gè)變量,中間有一個(gè)空格:
cron.schedule = ${cron_sec} ${cron_min} ${cron_hr} ${cron_day} ${cron_mth} ${cron_wk}
并在每個(gè)環(huán)境變量設(shè)置為所需值的情況下運(yùn)行它。類似于上面失敗的例子:
cron_sec=0
cron_min=30
cron_hr=*
cron_day=*
cron_mth=*
cron_wk=*
我得到了預(yù)期的輸出:
2021-04-29 12:29:25.539 INFO 22896 --- [ main] c.e.s.SchedulingTasksApplication
: Started SchedulingTasksApplication in 3.677 seconds (JVM running for 5.441)
2021-04-29 12:30:00.003 INFO 22896 --- [ scheduling-1] c.e.schedulingtasks.ScheduledTasks
: The time is now 12:30:00
如果這篇文章可以幫助其他人解決此類問題,那么我的工作就完成了!