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通过增加第六个用于秒的参数来扩展它。最后,我们探讨了如何使用特殊字符来创建复杂的调度模式。