1、概览 {#1概览}
通过 Cron 表达式,我们可以安排任务在特定日期和时间定期运行。Cron 表达式在 Unix 中推出后,其他基于 Unix 的操作系统和软件库(包括 Spring)都采用了它的任务调度方法。
本文将带你了解基于 Unix 操作系统的 Cron 表达式与 Spring Cron 之间的区别。
2、Unix Cron {#2unix-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 {#3spring-cron}
要在 Spring 中调度周期性后台任务,我们通常会向 @Scheduled
注解传递一个 Cron 表达式。
与 Unix 系统中的 Cron 表达式不同,Spring 中的 Cron 表达式有六个空格分隔字段:秒、分、小时、日、月和星期。
例如,要每十秒钟运行一次任务,可以这样:
*/10 * * * * *
每天从上午 8 点到上午 10 点,每 20 秒运行一次任务:
*/20 * 8-10 * * *
正如上面的示例所示,第一个字段表示表达式的秒部分。这是两个实现之间的区别。尽管秒部分的字段不同,但 Spring 支持原始 Cron 的许多功能,例如范围数字或列表。
从实现的角度来看,CronSequenceGenerator
类负责解析 Spring 中的 Cron 表达式。
4、总结 {#4总结}
本文介绍了 Unix 操作系统的 Cron 表达式与 Spring Cron 之间的区别,以及 Spring 如何解决了 Unix Cron 不支持秒级调度的问题。
Ref:https://www.baeldung.com/cron-syntax-linux-vs-spring