每天凌晨1点01分的Spring cron表达式

296

我想让我的代码根据Spring cron表达式在固定的时间执行。我希望代码每天早上1:01执行。我尝试了下面的表达式,但是没有触发。这里的语法有什么问题吗?

@Scheduled(cron = "0 1 1 ? * *")
public void resetCache() {
    // ...
}

http://www.quartz-scheduler.org/api/2.2.1/org/quartz/CronExpression.html - Kanagavelu Sugumar
http://www.quartz-scheduler.org/api/2.2.1/org/quartz/CronTrigger.html?is-external=true - Kanagavelu Sugumar
我的 cron 表达式 0 0 0 1 JAN MON 工作到去年为止。从 1 月 1 日开始出现无效的 cron 表达式错误,停止工作。尽管这个表达式的频率非常低,但我们能够运行 tc 服务器。在 1 月 1 日之后就无法正常工作了。当我将其更改为 0 0 7?* SUN 时,它开始正常工作。我很好奇为什么 0 0 0 1 JAN MON 停止工作,而去年的 1 月份它却能够正常工作。 - spandey
0 0 0 1 JAN MON 可能是错误的表达方式,但即使如此它也能正常工作,且 tc 服务器从未抱怨。 - spandey
6个回答

795

尝试使用:

@Scheduled(cron = "0 1 1 * * ?")

以下是来自Spring论坛的示例模式:

* "0 0 * * * *" = the top of every hour of every day.
* "*/10 * * * * *" = every ten seconds.
* "0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.
* "0 0 8,10 * * *" = 8 and 10 o'clock of every day.
* "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.
* "0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays
* "0 0 0 25 12 ?" = every Christmas Day at midnight

Cron表达式由六个字段表示:

second, minute, hour, day of month, month, day(s) of week

(*) 表示匹配任意值

*/X 表示 "每 X"

? ("没有具体值") - 在需要指定允许输入的两个字段中的一个字段的值时很有用,但是另一个字段的值不重要。例如,如果我希望我的触发器在月份的特定一天(例如第10天)触发,但我不关心那是星期几,我将把"10"放在日期字段中,而在星期字段中放入"?"。

提示:为了让它正常工作,请记得在应用程序上下文中启用它:https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling-annotation-support


25
格式也在Spring本身中记录在此处 - http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/scheduling/support/CronSequenceGenerator.html - chrismarx
2
我猜Spring Cron也可以提供秒级别的配置,但普通的Unix Cron是以分钟为单位的。因为在Unix手册中,分钟是可以配置的最小时间单位。 - nanosoft
9
“?”字符的意义是什么?它只适用于“星期几”的字段吗?如果我们在圣诞节的例子中用“*”替换“?”,它会起作用或产生不同的效果吗? - encrest
2
@encrest 看一下这里:https://dev59.com/VGgu5IYBdhLWcg3wMkbF - gipinani
1
好的教程在http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger。 - Trey Jonn
显示剩余7条评论

133

我的调度器是用于每天早上6点触发的,我的cron表示法是:

0 0 6 * * *

如果你想要 1:01 上午,那么将其设置为

0 1 1 * * *

调度程序的完整代码

@Scheduled(cron="0 1 1 * * *")
public void doScheduledWork() {
    //complete scheduled work
}

** 非常重要

为确保您的调度程序触发时间正确,您需要设置区域值,如下所示(我在伊斯坦布尔):

@Scheduled(cron="0 1 1 * * *", zone="Europe/Istanbul")
public void doScheduledWork() {
    //complete scheduled work
}

你可以在这里找到完整的时区数值。

注意:我的Spring框架版本为:4.0.7.RELEASE


1
我不知道为什么你的答案只有12个,即使它是这里唯一正确的答案! - user1115139
3
非常感谢@MoayadAbuJaber。得分并不重要,如果开发者能通过我的答案解决他们的问题,那就足够了,干杯! - Bahadir Tasdemir
我可以在XML配置计划程序中使用Zone吗? <task:scheduled ref="paypalCronJob" method="runTask" cron="0 0 6 * * * ?"/> ?? - shareef
4
感谢提及时区,点赞。 - Asraful
2
谢谢,@Forhad。如果你是一名开发者,并且正在处理与日期和时间相关的任何问题,你必须了解时间戳、时区和转换的详细信息。否则,你的数据将毫无意义。 - Bahadir Tasdemir
显示剩余4条评论

26
您可以使用@Scheduled(cron ="0 1 1 * * ?")来注释您的方法。
0 - 表示秒
1 - 表示1分钟
1 - 表示一天中的小时。

15

gipinani的回答中有所遗漏

@Scheduled(cron = "0 1 1,13 * * ?", zone = "CST")

这将在1.01和13.01执行。当您需要一天内多次运行作业而无需模式时,它非常有用。

而且,当您在远程服务器上进行部署时,zone属性非常有用。这是在spring 4中引入的。


2
请注意,缩写(用于时区)的支持仅适用于JDK 1.1.x兼容性,并且应使用全名-根据javadoc。 - slashron

6

我注意到的一件事是:Spring的CronTrigger不是标准的cron表达式。你可能会用一个有效的cron表达式(可以在cronmaker.com上验证)最终得到7个参数,但Spring可能会拒绝它。大多数情况下,你只需要删除最后一个参数,然后一切都可以正常工作。


2
"CronTrigger 不是 Quartz" - Sandy Simonton

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接