在 Linux 系统上的遗留作业系统中,我有一个像这样的 Cron 表达式
30 08 28 * 5 /home/me/myJob.sh
让
myJob
在每个月的 28 日和每个星期五的 08:30 运行。 “和”一个人会在这里说,但从 IT 的角度来看,这并不完全正确。实际上它是OR
:一天是一个月的28号或者是星期五。这正是 Linux Cron 所做的:在日期或当天。对于当前的 3 月/2023 年,它在 3 日、10 日、17 日、24 日、28 日和 31 日运行。
不幸的是,Spring 的人反其道而行之。在德语中有一句俗语“What had been riding them!”。在
@Scheduled(cron = "00 30 08 28 * 5")
表达式的上下文中,它确实是一个“AND”:一天是 28 号星期五。对于当前月份 March/2023,它根本不会运行,因为 28 号不是星期五。
这种困境导致我们被要求在 Spring Boot 系统中声明上述遗留 Cron 条件,在
@Scheduled
结构中编写两个 @Schedules
表达式。
最佳做法是将它们放在 Yaml 属性文件中:
my:
job:
properties:
schedules:
- "00 30 08 28 * *"
- "00 30 08 * * 5"
对应的Spring配置bean应该是:
@Configuration
@ConfigurationProperties(prefix = "my.job.properties")
public class myConfig {
private List<String> schedules;
public List<String> getSchedules() {
return schedules;
}
public void setSchedules(List<String> schedules) {
this.schedules = schedules;
}
}
我应该能够定义我的工作:
@Schedules({
@Scheduled(cron = "${myConfig.schedules[0]}"),
@Scheduled(cron = "${myConfig.schedules[1]}")
})
public void myJob() {
...
}
或
@Schedules({
@Scheduled(cron = "#{${my.job.properties.schedules}[0]}",
@Scheduled(cron = "#{${my.job.properties.schedules}[1]}"
})
public void myJob() {
...
}
但两者都不适合我。任务
myJob
根本没有开始。
我做错了什么?我错过了什么? SpEL 错了吗?
我带来的工作是使用两个属性
schedule1
和 schedule2
,在 myConfig
中有两个字符串属性,具有这些名称和值 "30 * * * * *"
和 "11 * * * * *"
并在两个 @Scheduled(cron = ...)
表达式中使用它们。
任何帮助将不胜感激。