Contents

Linux和Spring中的Cron语法的差异

1. 概述

Cron 表达式使我们能够安排任务在特定日期和时间定期运行。在 Unix 中引入后,其他基于 Unix 的操作系统和软件库(包括 Spring Framework)也采用了它的任务调度方法。

在这个快速教程中,我们将了解基于 Unix 的操作系统中的 Cron 表达式和 Spring 框架之间的区别。

2. Unix Cron

大多数基于 Unix 的系统中的Cron 有五个字段:分钟 (0-59)、小时 (0-23)、月份 (1-31)、月份(1-12 或名称)和星期几( 0-7 或名称)。

我们可以在每个字段中添加一些特殊值,例如星号 (*):

5 0 * * *

该作业将在每天午夜后 5 分钟执行。也可以使用一系列值:

5 0-5 * * *

这里调度器将在午夜后 5 分钟执行任务,每天 1、2、3、4 和 5 点后 5 分钟执行任务。

或者,我们可以使用值列表:

5 0,3 * * *

现在调度程序在每天午夜后五分钟和三点后五分钟执行作业。最初的 Cron 表达式提供的功能  比我们目前介绍的要多得多。

但是,它有一个很大的限制:我们不能安排具有第二精度的作业,因为它没有专门的第二字段。 让我们看看 Spring 如何设法解决这个限制。

3. Spring Cron

为了在 Spring 中安排周期性的后台任务,我们通常将 Cron 表达式传递给 *@Scheduled *注解。

与基于 Unix 的系统中的 Cron 表达式相反,Spring 中的 Cron 表达式有六个以空格分隔的字段:秒、分钟、小时、日、月和工作日

例如,要每十秒运行一次任务,我们可以这样做:

*/10 * * * * *

另外,每天早上 8 点到 10 点每 20 秒运行一次任务:

*/20 * 8-10 * * *

如以上示例所示,**第一个字段表示表达式的第二部分。这就是两种实现方式的区别。**尽管第二个字段有所不同,但 Spring 支持原始 Cron 的许多功能,例如范围编号或列表。

从实现的角度来看,CronSequenceGenerator 类负责解析 Spring 中的 Cron 表达式。