Java Cron 表达式

2025年03月17日 | 阅读 9 分钟

技术日新月异。有时,我们需要在服务器上定期执行一个任务。在服务器上手动运行任务是一项艰巨的任务,用户或管理员无法多次完成。为了解决这个问题,Cron 帮助程序员在服务器上定期执行一个任务。它广泛用于自动化系统维护和管理。此外,我们还可以在 Web 开发中使用Cron 表达式。在许多情况下,Web 应用程序可能需要定期执行某些任务。

在本节中,我们将讨论Java Cron 表达式、它的工作原理以及通过Java Quartz 调度器的实现。

什么是 Cron?

基本上,Cron 是一个调度任务的实用程序。它允许用户在指定的时间、日期、月份、星期和年份定期调度任务。它广泛用于不需要人工干预的自动化流程。

Java Cron Expression

Cron 表达式

在 Java 中,Cron 表达式用于配置 CronTrigger 类的实例。它是 org.quartz.Trigger 类的一个子类。Cron 表达式是一个由六个或七个字段(时间单位)组成的字符串或表达式。它描述了计划和命令的各个详细信息。

Cron 表达式可以简单也可以复杂。例如,

简单: * * * * ? *(星号表示字段)

复杂: 0 0/4 12,15,3-35,52 ? May,June,july TUE-SAT 2002-2010。

另外,请注意,Cron 表达式可以用不同的样式编写,如下所示。例如,以下三个 Cron 表达式具有相同的含义。

  • 0 10 9 ? * *
  • 0 10 9 * * ?
  • 0 10 9 * * ? *

这三个表达式都每天早上 9:10 执行。

Cron 表达式中使用的字段

在 Cron 表达式中,时间单位称为字段。它们由空格分隔,可以包含任何允许的值,以及该字段允许的字符的各种组合。它按预期顺序显示字段。下表描述了时间单位和对应的允许值以及可与表达式一起使用的符号。

字段名必需允许的值允许与字段一起使用的特殊字符和符号
是的0-59, - * /
分钟是的0-59, - * /
小时是的0-23, - * /
月份中的天是的-31, - * ? / L W C
月份是的0-11 或 JAN-DEC, - * /
星期中的天是的1-7 或 SUN-SAT, - * ? / L C #
年份可选空或 1970-2099, - * /

Cron 表达式中使用的特殊符号和字母

星号(*): 当我们希望在每个时间单位(分钟、秒、小时)执行事件时使用该符号。例如,如果 * 与分钟时间单位一起使用,则表示事件将自动每分钟执行一次。

问号(?): 该符号用于月份中的天和星期中的天等字段。它表示任意值并忽略字段值。假设我们想在每个月的第二天执行一个脚本,而不关心当月第二天是星期几。在这种情况下,我们应该在星期中的天字段中指定一个问号(?)。

连字符(-): 该符号用于指定范围。它确定值的范围。例如,如果小时字段定义为<4-5>,则表示事件将在第 4 小时和第 5 小时执行。

逗号(,): 它用于定义由逗号分隔的字段值。例如,Fri, Sat, Sun 等。

正斜杠(/): 它用于增加指定时间单位的值。假设我们想在 10 分钟时开始一个事件,之后我们需要在 20 分钟时执行同一个事件,然后是 30 分钟,依此类推。在这种情况下,我们指定开始时间和增量值,用正斜杠分隔。

例如,如果在分钟字段中指定了10/10,则表示第一个事件在 10 分钟时执行,下一个执行将在一个小时的 20 分钟时执行,依此类推。

L (Last): L 的用法在不同字段中有不同的含义。

  • 如果它已用于月份中的天字段,则表示根据日历,该月最后一天。
  • 如果它与偏移量一起使用,如L-5。它表示日历月份的倒数第 5 天。
  • 如果它已用于星期中的天字段,则表示该星期的最后一天。它也可以与其他值一起用于星期中的天字段。例如,7L 表示最后一个星期六

W: 后者代表工作日(周一至周五)。它确定最接近月份指定日期的星期几。

例如,如果我们指定月份中的天为5W,则表示 W 确定最接近本月第 5 天的星期几。

  • 如果本月第 5 天是星期六,事件将在本月9日触发。
  • 如果本月第 5 天是星期日,事件将在本月11日触发。

可能还存在另一种情况。假设本月 1 号是星期六,事件将在本月 3 号发生。这意味着事件或脚本不会在上个月执行。

Hash (#): 它表示该月星期几的第 n 次出现。例如,该月的第三个星期五可以表示为6#3

为什么我们应该使用 Cron 表达式?

使用 Cron 表达式有多种原因。其中一些是

  • 我们可以在特定时间间隔过期和删除缓存的数据文件。
  • 我们可以安排每日新闻通讯和电子邮件。
  • 我们可以安排长时间运行的任务从命令行脚本运行,而不是从 Web 脚本运行。例如,编码视频或发送批量电子邮件。

Cron 表达式示例

让我们看一些使用特殊符号和字段的常见 Cron 表达式。

Cron 表达式Cron 表达式的含义
0 12 * * ?表示每天中午 12:00 执行作业。
0/5 13,18 * * ?表示作业将在下午 1:00 到 1:55 之间每五分钟执行一次,然后从下午 6:00 到 6:55 之间每五分钟执行一次,每天如此。
0-5 13 * * ?表示每天下午 1:00 到 1:05 之间每分钟执行作业。
15,45 13 ? 6 Tue表示作业将在六月的每个星期二下午 1:15 和下午 1:45 执行。
30 9 ? * MON-FRI表示作业将在每周一、周二、周三、周四和周五的上午 9:30 执行。
30 9 15 * ?表示作业将在每月 15 日的上午 9:30 执行。
0 18 L * ?表示作业将在每月最后一天晚上 6:00 执行。
0 18 L-3 * ?表示作业将在每月倒数第三天晚上 6:00 执行。
30 10 ? * 5L表示作业将在每月最后一个星期四的上午 10:30 执行。
0 10 ? * 2#3表示作业将在每月第三个星期一的上午 10:00 执行。
0 0 10/5 * ?表示作业将在每月 10 日开始的五天内,每天午夜 12:00 执行。
0 11 11 11 11 ?表示作业将在每年 11 月 11 日上午 11:11 执行。
0 15 10 ? * 6L 2002-2005在 2002、2003、2004 和 2005 年期间,每月最后一个星期五上午 10:15 执行。
0 0 0 ? * MON#1表示作业将在每月第一个星期一午夜执行。
0 0 0 LW * *表示作业将在每月最后一个工作日午夜执行。
0 0/30 8-10 * * *表示作业将在每天的 8:00、8:30、9:00、9:30、10:00 和 10:30 执行。

Cron 表达式中的特殊设置

除了上述特殊符号外,Cron 表达式还支持一些预定义的特殊值。这些值可以代替字段使用。

  • @yearly 或 @annually: 每年运行一次作业。例如,"0 0 0 1 1 *"
  • @monthly: 每月运行一次作业。例如,"0 0 0 1 * *"
  • @weekly: 每周运行一次作业。例如,"0 0 0 * * 0"
  • @daily 或 @midnight: 每天运行一次作业。例如,"0 0 0 * * *"
  • @hourly: 每小时运行一次作业。例如,"0 0 * * * *"

在 Java 中使用 Cron 表达式

Java 提供了一个开源作业调度系统,用于在特定时间单位调度作业。我们可以从官方网站下载 Quartz 调度器

从编程角度来看,作业是一个包含要执行的任务的类。但问题是如何调度它。要调度作业,我们定义一个触发器并指定作业何时执行。

如果我们要实现 Quartz 调度器,可以添加依赖项,如下所示

注意:在执行以下 Java 程序之前,请确保已将 quartz-2.2.1.jar 文件添加到路径中,否则会报错。

让我们通过一个 Java 程序来看看 Cron 表达式和作业的实现。

步骤 1:创建一个 Maven 项目。我们将其命名为CronExample

步骤 2:在项目内,创建两个名为com.javatpoint.appcom.javatpoint.job 的包。在第一个包中,我们将定义主类;在第二个包中,我们将定义作业(在本例中,有五个作业)。

步骤 3:在 pom.xml 文件中,粘贴以下依赖项。它会自动下载项目所需的 JAR 文件。pom 文件如下所示。

步骤 4:创建五个您想要执行的作业(在 com.javatpoint.job 包中)。在本例中,我们定义了以下五个作业。

Job1.java

Job2.java

Job3.java

Job4.java

Job5.java

步骤 5:创建一个名为 MyApp 的主类。

MyApp.java

完成以上所有步骤后,项目目录如下所示。

Java Cron Expression

步骤 6:运行上述 Java 程序以查看输出。

Java Cron Expression

我们观察到每个作业都在特定的时间间隔执行。