两者之间有区别吗?和*在cron表达式?奇怪的例子

时间:2016-09-05 10:12:29

标签: java spring cron quartz-scheduler

我的系统中有以下cron表达式:

0 0 0/1 1/1 * ? *

你知道吗?我不知道这意味着什么。写这篇文章的人是他未来两周的假期,所以我必须自己找出答案。可以找到文档here

根据我们的documentation

* * * * * * *
| | | | | | | 
| | | | | | +-- Year              (range: 1970-2099)
| | | | | +---- Day of the Week   (range: 1-7 or SUN-SAT)
| | | | +------ Month of the Year (range: 0-11 or JAN-DEC)
| | | +-------- Day of the Month  (range: 1-31)
| | +---------- Hour              (range: 0-23)
| +------------ Minute            (range: 0-59)
+-------------- Second            (range: 0-59)

好的,让我告诉你我的想法:我相信这个表达意味着:

start when:
    seconds:        0
    minutes:        0
    hours:          0
    dayOfMonth      1
    monthOfYear     any
    dayOfWeek       any
    year            any

run every:
    1               hour
    1               dayOfWeek
when:
    dayOfWeek same as on first execution

然而,可用的cron表达式监视器表示它只是意味着每小时。 作为编写高级Java Dev的人,他必须知道编写这种表达式的任何理由而不是:

0 0 * * * * *

我们使用org.springframework.scheduling.quartz.QuartzJobBean

简短摘要

嗯,我认为我的问题是:0 0 0/1 1/1 * ? *0 0 * * * * *之间有什么区别?

修改

The documentation可以在这里找到。

3 个答案:

答案 0 :(得分:19)

0/1表示从小时0开始,并重复每1小时
1/1从该月的第一天开始,每个1天执行

所以这个模式每小时执行一次cron,从月份的第一天开始,每天重复一次。

  

要求在?dayOfWeek中使用dayOfMonth
  指定星期和月日值的支持尚未完成(您必须在其中一个字段中使用“?”字符)。 - xenteros 7分钟前

然后,0 0 * * * ? *(而不是0 0 * * * *,并且?强制执行)将是相同的表达式,忽略秒和分钟并获取其他元素的每个值,将执行每个小时和每天。

根据您的信息:

0 0 0/1 1/1 * ? *
| |  |   |  | | | 
| |  |   |  | | +-- Year              (range: 1970-2099)
| |  |   |  | +---- Day of the Week   (range: 1-7 or SUN-SAT)
| |  |   |  +------ Month of the Year (range: 0-11 or JAN-DEC)
| |  |   +--------- Day of the Month  (range: 1-31)
| |  +------------- Hour              (range: 0-23)
| +---------------- Minute            (range: 0-59)
+------------------ Second            (range: 0-59)

this explanation特殊字符:

*(“所有值”)

  

用于选择字段中的所有值。例如,分钟字段中的“”表示“每分钟”。

?(“无特定值”)

  当您需要在允许该字符的两个字段之一中指定某些内容时,

非常有用,而另一个字段则不需要。例如,如果我希望我的触发器在该月的某个特定日期(例如,第10天)触发,但不关心恰好在一周的哪一天,我会在当天放置“10” -month字段,以及星期几字段中的“?”。

<强> /

  

用于指定增量。例如,秒字段中的“0/15”表示“秒0,15,30和45”。并且秒字段中的“5/15”表示“秒5,20,35和50”。你也可以在''字符后指定'/' - 在这种情况下''相当于在'/'之前有'0'。日期字段中的“1/3”表示“从该月的第一天开始每3天触发一次”。

*?

之间的差异

要解释表达式中?*之间的区别,首先要看一下这个表:

Field Name      Mandatory   Allowed Values      Allowed Special Characters
Seconds         YES         0-59                , - * /
Minutes         YES         0-59                , - * /
Hours           YES         0-23                , - * /
Day of month    YES         1-31                , - * ? / L W   //allowed '?'
Month           YES         1-12 or JAN-DEC     , - * /
Day of week     YES         1-7 or SUN-SAT      , - * ? / L #   //allowed '?'
Year            NO          empty, 1970-2099    , - * /

正如您所看到的,?仅允许在Day of month中使用,Day of week在两个字段中都是强制性的,并告诉Quartz此值尚未定义,因此,请使用其他字段字段(如果您将?放入Day of month,则使用的值为Day of week)。

答案 1 :(得分:2)

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

之间没有实际差异

分析不同的标记:
0/1*小时 - 首先是指每天从小时0开始,每小时重复一次,第二个意味着:每小时重复一次
1/1*天 - fisrt表示从月的第一天开始,每天重复,第二天表示每天。

有人使用复杂表达式的原因可能是通过测试,表达式被评估为这种形式,没有人承担简化它的工作,或者可能以前的cron版本工作不同。

答案 2 :(得分:0)

不是答案,只是对@joc正确答案的更新。

就目前而言,QuartzScheduler specifically指出?可以应用于以下两个位置之一:day_of_monthday_of_week

  

支持同时指定星期几和每月某天的值还不完善(您当前必须在这些字段之一中使用“?”字符)。

在上面随附的链接中,还有许多示例可以很好地指导您提出自己的示例。


+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+
|   **Expression**   |                                                             **Meaning**                                                             |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+
| 0 0 12 * * ?       | Fire at 12pm (noon) every day                                                                                                       |
| 0 15 10 ? * *      | Fire at 10:15am every day                                                                                                           |
| 0 15 10 * * ?      | Fire at 10:15am every day                                                                                                           |
| 0 15 10 * * ? *    | Fire at 10:15am every day                                                                                                           |
| 0 15 10 * * ? 2005 | Fire at 10:15am every day during the year 2005                                                                                      |
| 0 * 14 * * ?       | Fire every minute starting at 2pm and ending at 2:59pm, every day                                                                   |
| 0 0/5 14 * * ?     | Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day                                                                |
| 0 0/5 14,18 * * ?  | Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+