我对 Java 很陌生。作为我的第一个项目,我将使用 cron 作业调度程序。我想要一些关于日程安排的澄清。我有一个每小时运行一次的代码。
CronTrigger ct = new CronTrigger("cronTrigger", "group2", "0 1/0 * * * ?");
我已经阅读了有关调度的文档,但我很困惑
在我读过的一份文件中,如下所示
("0 0 * * * ?")
在一些文档中,我读到第一个表示分钟,第二个表示小时等。
任何人都可以解释一下这个(0 1/0 * * * ?)以及它的含义(1/0)吗?
我想每六个小时运行一次作业。
如果我这样(
0 */6 * * * ?
)它是否会每六个小时运行一次?
如果您检查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 个常用参数正常安排它,然后在末尾添加
?
,以便它在所有年份都运行。
一个小错误溜进了接受的答案中: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 表达式
所有 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)
│ │ │ │ │ │
* * * * * *