跳过正文

理解 Spring 的 @Scheduled Cron 语法

Spring Cron Scheduling
翻译者
Namastecode
目录

1. 介绍

在本教程中,我们将学习如何在 Spring 中使用 @Scheduled 注解结合 cron 表达式。

在 Spring 中使用的 cron 表达式与 Unix 的 cron 表达式略有不同,因为它需要一个额外的字段。这可能会让我们中的一些人在使用第六个字段时感到困惑。

让我们先了解不同的 cron 表达式类型,然后学习如何在 Spring 中配置 @Scheduled 注解。

2. 标准 Cron 表达式格式

在基于Unix的系统和大多数在线cron表达式工具中,cron表达式通常由五个用空格分隔的字段组成:

 ┌───────────── minute (0 - 59)
 │ ┌───────────── hour (0 - 23) 
 │ │ ┌───────────── day of the month (1 - 31)
 │ │ │ ┌───────────── month (1 - 12) 
 │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday; 7 is also Sunday)
 │ │ │ │ │
 │ │ │ │ │
 * * * * * command to execute

每个字段代表特定的时间单位,并且可以包含括号中的范围值。例如,我们可以编写一个 cron 表达式来表示每周五下午 6 点运行一个作业:

0 18 * * 5

这里,星号代表“每一个”值,因此这个表达式将在每周五的晚上6点运行该任务。

将此 cron 表达式插入 @Scheduled 中将导致我们的 Spring 应用程序无法启动,因为它需要不同的格式。让我们看看如何在 Spring 中使用 @Scheduled 注解。

3. 在 Spring 中使用 @Scheduled 注解

要在Spring应用程序中配置任务在特定时间或间隔运行,我们可以使用*@Scheduled*注解以及cron表达式:

@Scheduled(cron = "0 0 18 * * 5")
public void scheduledTask() {
    // Task logic here
}

同样,在这个例子中,cron 表达式将会在每周五下午6点运行 scheduledTask() 方法。我们可以看到,这个格式与标准的 cron 表达式类似,但它需要一个额外的字段。

因此,Spring 通过在开头添加第六个参数来表示秒,从而扩展了标准格式:

 ┌───────────── second (0 - 59)
 │ ┌───────────── minute (0 - 59)
 │ │ ┌───────────── hour (0 - 23)
 │ │ │ ┌───────────── day of the month (1 - 31)
 │ │ │ │ ┌───────────── month (1 - 12)
 │ │ │ │ │ ┌───────────── day of the week (0 - 7) (0 and 7 both represent Sunday)
 │ │ │ │ │ │
 * * * * * *

能够对任务调度进行更细粒度的控制,使我们可以将 cron 任务精确到秒级。然而,值得注意的是,系统负载可能会严重影响计划任务的实际执行时间。

我们必须注意,要在 Spring 中启用调度,我们需要在配置类中添加 @EnableScheduling 注解。

Cron 表达式非常灵活,当与特殊字符结合使用时,功能更加强大。让我们来概览一下这些特殊字符。

4. Cron 表达式中的特殊字符

就像标准的cron语法一样,Spring cron表达式支持特殊字符以提供更大的灵活性。

我们可以使用星号 * 来表示一个字段的所有可能值。或者,我们可以使用问号 ? 来表示没有特定值,通常用于“月份中的某一天”或“星期中的某一天”。

例如,要在每周的每天整点运行一个任务:

@Scheduled(cron = "0 0 * * * ?")

我们也可以使用逗号来指定多个值,或者使用连字符 - 来指定一系列的值。此外,我们可以使用正斜杠 / 来指定增量。

例如,要在每月的1日至15日之间的周六和周日每2小时运行一次任务:

@Scheduled(cron = "0 0 0/2 1-15 * 6,7")

从上一个例子中我们可以看到,我们可以结合多个特殊字符来创建复杂的调度模式。

5. 结论

在本文中,我们学习了Spring中的Cron表达式以及如何将其与*@Scheduled*注解一起使用。首先,我们了解了标准的Unix cron表达式格式,然后看到Spring通过增加第六个用于秒的参数来扩展它。最后,我们探讨了如何使用特殊字符来创建复杂的调度模式。

相关文章

在 Spring 中获取 Properties 文件中定义的值
Spring Properties Basics
配置 Spring Boot 应用程序的端口
Spring Basics
在Spring应用程序中返回HTTP 4XX错误
Spring HTTP