Java中Cron Job第六个参数

问题描述 投票:0回答:3

我对 Java 很陌生。作为我的第一个项目,我将使用 cron 作业调度程序。我想要一些关于日程安排的澄清。我有一个每小时运行一次的代码。

  CronTrigger ct = new CronTrigger("cronTrigger", "group2", "0 1/0 * * * ?"); 

我已经阅读了有关调度的文档,但我很困惑

在我读过的一份文件中,如下所示

 ("0 0 * * * ?") 
  • 第一个0表示秒
  • 第二表示分钟
  • 第3个小时
  • 该月的第四天
  • 哪个月的第5号。

在一些文档中,我读到第一个表示分钟,第二个表示小时等。

任何人都可以解释一下这个(0 1/0 * * * ?)以及它的含义(1/0)吗?

我想每六个小时运行一次作业。

如果我这样(

0 */6 * * * ?
)它是否会每六个小时运行一次?

java cron
3个回答
16
投票

如果您检查crontab.guru,这两者几乎是等效的:

*   * * * *
* 1/0 * * *

这是因为

X/Y
的意思是:从
X
开始,每
Y
。即,所有 X + Yn。因此,如果您说
*/2
,它将每 2 小时执行一次。

在本例中:

1/0
表示“从1开始,每小时”,因此它匹配从1到23,而
*
匹配从0到23。

根据您的问题,

*/6
每 6 小时匹配一次,因此它将精确地在 0、6、12 和 18 小时运行。

关于你关于第 6 个参数

?
做什么的问题,我读到

我相信这是由 CronExpression 类处理的,它有六个 常量:分钟、小时、日、月、工作日、年。 cron 使用分钟, 小时、天、月、工作日。为yearly() 添加年份 方法似乎是额外*的原因。

所以不要使用通用语法

 +---------------- minute (0 - 59)
 |  +------------- hour (0 - 23)
 |  |  +---------- day of month (1 - 31)
 |  |  |  +------- month (1 - 12)
 |  |  |  |  +---- day of week (0 - 6) (Sunday=0 or 7)
 |  |  |  |  |
 *  *  *  *  *  command to be executed 

有了 Java,你就拥有了

   +----------------- minute (0 - 59)
   |  +-------------- hour (0 - 23)
   |  |  +----------- day of month (1 - 31)
   |  |  |  +-------- month (1 - 12)
   |  |  |  |  +----- day of week (0 - 6) (Sunday=0 or 7)
 # |  |  |  |  |  +-- year                       <-- this is extra !!
   |  |  |  |  |  |
   *  *  *  *  *  * command to be executed 

最后一个参数也可以有一个值,但在您的情况下它指定

?
。至于我在crontab.guru中读到的内容,它的意思是:

空白(非标准)

所以我会用 5 个常用参数正常安排它,然后在末尾添加

?
,以便它在所有年份都运行。


12
投票

一个小错误溜进了接受的答案中:Spring 六字段 cron 表达式中的额外字段是“第二”的第一个字段

+-------------------- second (0 - 59) <- extra field in Spring cron expression
|  +----------------- minute (0 - 59)
|  |  +-------------- hour (0 - 23)
|  |  |  +----------- day of month (1 - 31)
|  |  |  |  +-------- month (1 - 12)
|  |  |  |  |  +----- day of week (0 - 6) (Sunday=0 or 7)
|  |  |  |  |  |
*  *  *  *  *  *   <command to be executed>

请注意,Spring 中每 5 个字段 cron 表达式示例或通过互联网上的 cron 计算器(如 crontab.guru)计算的结果都是错误的。

表达式:

0 * * * *
(5 个字段)将使 Spring 抛出一个
IllegalArgumentException("Cron expression must consist of 6 fields")
。 5 字段 cron 表达式必须通过添加前导 '*' 或 '0' 转换为 Spring 的 6 字段格式。

另请参阅Spring cron 与普通 cron?


2
投票

只需在这个疑问的确切点添加 spring 文档即可明确 调度 cron 表达式

所有 Spring cron 表达式必须符合相同的格式, 无论您是否在 @Scheduled 注释中使用它们, 任务:计划任务元素,或其他地方。一个结构良好的 cron 表达式,例如 * * * * * *,由六个空格分隔的时间组成 和日期字段,每个字段都有自己的有效值范围

 ┌───────────── second (0-59)
 │ ┌───────────── minute (0 - 59)
 │ │ ┌───────────── hour (0 - 23)
 │ │ │ ┌───────────── day of the month (1 - 31)
 │ │ │ │ ┌───────────── month (1 - 12) (or JAN-DEC)
 │ │ │ │ │ ┌───────────── day of the week (0 - 7)
 │ │ │ │ │ │          (0 or 7 is Sunday, or MON-SUN)
 │ │ │ │ │ │
 * * * * * *
© www.soinside.com 2019 - 2024. All rights reserved.