Linux 与 Spring 中 Cron 的区别

1、概览

通过 Cron 表达式,我们可以安排任务在特定日期和时间定期运行。Cron 表达式在 Unix 中推出后,其他基于 Unix 的操作系统和软件库(包括 Spring)都采用了它的任务调度方法。

本文将带你了解基于 Unix 操作系统的 Cron 表达式与 Spring Cron 之间的区别。

2、Unix Cron

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

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

5 0 * * *

任务将在每天午夜后 5 分钟执行。也可以使用数值范围:

5 0-5 * * *

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

或者,可以使用一个值列表:

5 0,3 * * *

现在,调度器会在每天午夜 12 点后 5 分钟和下午 3 点后 5 分钟执行作业。原始 Cron 表达式提供的功能远不止这些。

然而,它有一个很大的局限性:我们无法以秒为单位调度作业,因为它没有专门的秒字段

让我们来看看 Spring 是如何解决这个限制的。

3、Spring Cron

要在 Spring 中调度周期性后台任务,我们通常会向 @Scheduled 注解传递一个 Cron 表达式。

与 Unix 系统中的 Cron 表达式不同,Spring 中的 Cron 表达式有六个空格分隔字段:秒、分、小时、日、月和星期。

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

*/10 * * * * *

每天从上午 8 点到上午 10 点,每 20 秒运行一次任务:

*/20 * 8-10 * * *

正如上面的示例所示,第一个字段表示表达式的秒部分。这是两个实现之间的区别。尽管秒部分的字段不同,但 Spring 支持原始 Cron 的许多功能,例如范围数字或列表。

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

4、总结

本文介绍了 Unix 操作系统的 Cron 表达式与 Spring Cron 之间的区别,以及 Spring 如何解决了 Unix Cron 不支持秒级调度的问题。


Ref:https://www.baeldung.com/cron-syntax-linux-vs-spring