Java中的Cron Job第六个参数

00jrzges  于 2023-05-27  发布在  Java
关注(0)|答案(3)|浏览(131)

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

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

我看过有关日程安排的文件,但我搞不懂
在一份文件中,我读到如下

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

在一些文件中,我读到1st表示分钟,2nd - hour等。
有没有人可以解释一下(0 1/0 * * *)?)以及它的含义(1/0)?
我想每六个小时跑一次作业。
如果我给予这样的(0 */6 * * * ?)是否它将运行在每六个小时?

kx5bkwkv

kx5bkwkv1#

如果你登录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个参数?是做什么的问题,I read
我相信这是由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

最后一个参数也可以有一个值,但在您的示例中,它指定?。至于我在www.example.com上读到的内容crontab.guru,它的意思是:

**?**空白(非标准)

因此,我会使用5个常用参数正常调度它,然后在最后添加?,以便它在所有年份都运行。

wn9m85ua

wn9m85ua2#

一个小错误溜进了公认的答案:Spring six fields cron expressions中的extra field是“second"的first field

+-------------------- 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>

请注意,每5个字段cron表达式示例或由互联网上的cron计算器(如crontab.guru)计算的Spring都是错误的。
表达式:0 * * * *(5个字段)将使Spring抛出IllegalArgumentException("Cron expression must consist of 6 fields")。5字段cron表达式必须通过添加前导'*'或'0'转换为Spring的6字段格式。
参见Spring cron vs normal cron?

nhjlsmyf

nhjlsmyf3#

只是在这个疑问的确切点上加上了Spring的文档来说明。scheduling-cron-expression
所有Spring cron表达式必须符合相同的格式,无论您是在@Scheduled annotations,task:scheduled-tasks元素中使用它们,还是在其他地方使用它们。一个格式良好的cron表达式,如******,由六个空格分隔的时间和日期字段组成,每个字段都有自己的有效值范围:

<pre> ┌───────────── 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)
 │ │ │ │ │ │
 * * * * * *</pre>

相关问题