拥有 yaml cron 表达式列表,如何在我的配置中正确获取它们,然后按 SpEL 表达式访问它们?

问题描述 投票:0回答:0

在 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 的人反其道而行之。在德语中有一句俗语“骑着什么样的马!”。在

@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
根本没有开始。 我做错了什么?我错过了什么吗?

我带来的工作是使用两个属性

schedule1
schedule2
,在
myConfig
中有两个字符串属性,具有这些名称和值
"30 * * * * *"
"11 * * * * *"
并在两个
@Scheduled(cron = ...)
表达式中使用它们。

任何帮助将不胜感激。

spring cron scheduled-tasks
© www.soinside.com 2019 - 2024. All rights reserved.