如何在 Spring 中使用带@Scheduled 注解的 Cron 表达式?

How to use Cron expression with @Scheduled annotation in Spring?

我是 spring 中调度程序的新手。我阅读了很多关于 @scheduled 、 ScheduledExecutorService 和 TimerTask 的文章。

据我所知,@scheduled 和 ScheduledExecutorService 大部分功能相同,但如果您的代码在 spring 中,那么最好在您的代码中使用 @Scheduled 注释。

所以我的问题是假设我想在我的程序启动 15 分钟后 运行 一些任务,这意味着初始延迟是 15 分钟并且该任务应该是 运行 每 5 分钟后意味着 fixedRate 是5 分钟。那么通过使用 cron 表达式我该如何实现呢?

阅读以下链接:

  1. https://dzone.com/articles/schedulers-in-java-and-spring
  2. https://crontab.guru/#15____
  3. https://www.baeldung.com/spring-scheduled-tasks

我可以使用以下代码实现相同的目的,但我想用 cron 表达式编写此代码。

代码:

@Configuration
@EnableScheduling
public class ScheduledConfiguration {
    @Scheduled(fixedDelay = 5000, initialDelay = 1000)
    public void scheduleFixedRateWithInitialDelayTask() {

        long now = System.currentTimeMillis() / 1000;
        System.out.println("Fixed rate task with one second initial delay - " + now);
    }
}

您不能混合使用初始延迟和 cron。当延迟和速率不足并且您需要更大的灵活性时,可以使用 cron。

但是您可以像这样每 15 分钟使用 cron 安排一次:

@Scheduled(cron = "* /15 * * * *)

Cron 是一种将任务与日历对齐的语法。例如每个星期天下午 3 点。

它不能定义诸如“我的应用程序启动后 15 分钟”之类的事件,因为应用程序启动时间是未知的,并且可以是任何时间。它需要与时钟对齐。例如。整点15 分钟

同样,它不支持初始延迟与间隔不同的任务。

如果您想使用 cron,它可以 ,但您必须接受第一次调用可能需要约 1 秒到约 14 分 59 秒的任何时间,具体取决于您的应用程序启动的时间。