Linux和Spring中Cron语法的区别

1. 概述

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

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

2. Unix Cron

在大多数基于unix的系统中,Cron有5个字段:分钟(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 * * *

现在调度器每天在午夜后5分钟和3点后5分钟执行作业。原始的Cron表达式提供了比我们到目前为止介绍的更多的特性。

但是,它有一个很大的限制:我们不能用第二个精度调度作业,因为它没有专门的第二个字段。

让我们看看Spring是如何修复这个限制的。

3. Spring Cron

为了在Spring中定期调度后台任务,我们通常将Cron表达式传递给@Scheduled注释。

与基于unix的系统中的Cron表达式不同,Spring中的Cron表达式有6个空格分隔的字段:秒、分钟、小时、日、月和工作日。

例如,每十秒钟运行一个任务,我们可以做:

*/10 * * * * *

此外,每20秒运行一个任务,从早上8点到每天10m:

*/20 * 8-10 * * *

如上例所示,第一个字段表示表达式的第二部分。这就是两种实现之间的区别。尽管第二个字段不同,但Spring支持来自原始Cron的许多特性,比如范围号或列表。

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

4. 结论

在这个简短的教程中,我们看到了Spring和大多数基于unix的系统之间Cron实现的差异。在这个过程中,我们看到了这两种实现的一些示例。

为了查看更多Cron表达式示例,强烈建议查看我们的Cron表达式指南。此外,查看CronSequenceGenerator类的源代码可以让我们更好地了解Spring是如何实现这个特性的。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!