Spring Boot中的预定作业

时间:2018-06-11 15:04:02

标签: java spring-boot cron

我在应用程序属性文件中设置了一个cron表达式,如下所示:

report.monthlyScheduleTime=0 10 07 1W * ?

并注释如下,

@Scheduled(cron = "${report.monthlyScheduleTime}", zone="${report.scheduleTimeZone}")

但是当运行应用程序时,我得到以下异常。

  

引起:java.lang.IllegalStateException:遇到无效   @Scheduled方法'ReportJob':输入字符串:“1W”。

Spring Boot似乎不接受cron表达式中定义的1W。知道为什么吗?

2 个答案:

答案 0 :(得分:1)

  

Spring Boot似乎不接受cron表达式中定义的1W。知道为什么吗?

1W特定于Quartz,但您没有使用Quartz。

您的cron表达式(0 10 07 1W * ?)基于Quartz documentation

是正确的
  

'W'用于指定最接近给定日期的工作日(周一至周五)。例如,如果您指定“15W”作为日期字段的值,则含义为:“最近的工作日到该月的15日”。

但模式1W特定于Quartz。

使用@Scheduled,您正在使用Spring自己的调度支持。这允许基于Crontab pattern进行表达,但不支持1W

因此,您需要实际使用Quartz或修改您的cron表达式。如果你想在Spring documentation on scheduling中使用Quartz,那么“使用Quartz Scheduler”一节描述了Spring对Quartz的支持。但是,如果要修改cron表达式,可以参考CronSequenceGenerator

答案 1 :(得分:0)

不确定您想要创建什么样的cron,但也许这些示例可以帮助您了解您的问题:

Example patterns:

"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 6,19 * * *" = 6:00 AM and 7:00 PM every day.
"0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30, 10:00 and 10:30 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