Cron Expression在本月的最后一天无效

时间:2015-07-16 04:31:28

标签: java spring

我想安排一个任务在每个月的最后一天上午10:10运行。 cron表达式为0 10 10 L * ?

现在问题是CronSequenceGenerator正在为{L'值抛出NumberFormatException。这意味着Spring的CronSequenceGenerator不支持这种表达。但是,如果我只通过传递数字,它工作正常。

这是完整的堆栈跟踪:

Exception in thread "main" java.lang.NumberFormatException: For input string: "L"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.valueOf(Integer.java:582)
at org.springframework.scheduling.support.CronSequenceGenerator.getRange(CronSequenceGenerator.java:324)
at org.springframework.scheduling.support.CronSequenceGenerator.setNumberHits(CronSequenceGenerator.java:297)
at org.springframework.scheduling.support.CronSequenceGenerator.setDays(CronSequenceGenerator.java:275)
at org.springframework.scheduling.support.CronSequenceGenerator.setDaysOfMonth(CronSequenceGenerator.java:266)
at org.springframework.scheduling.support.CronSequenceGenerator.parse(CronSequenceGenerator.java:239)
at org.springframework.scheduling.support.CronSequenceGenerator.<init>(CronSequenceGenerator.java:81)
at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:54)
at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:44)
at com.hcdc.coedp.datantar.scheduler.SchedulerUtil.start(SchedulerUtil.java:75)
at com.hcdc.coedp.datantar.scheduler.SchedulerUtil.changeTrigger(SchedulerUtil.java:106)
at com.hcdc.coedp.datantar.scheduler.SchedulingService.scheduleTransfer(SchedulingService.java:70)
at com.hcdc.coedp.datantar.scheduler.Scheduler.schedule(Scheduler.java:107)     
at main.Main.main(Main.java:47)

4 个答案:

答案 0 :(得分:1)

请检查此链接 Cron Maker

在文本框中提供表达

  

0 10 10 L *?

答案 1 :(得分:1)

Spring不支持本月的最后一天。请参阅CronSequenceGenerator's javadoc

答案 2 :(得分:1)

还有另一种可能的方法,取决于你想做什么:

import org.apache.commons.lang3.time.DateUtils;

@Scheduled(cron = "0 0 0 1 * ?") // runs on the first day of each month
public void doStuffOnFirstDayOfMonth() {
    Date now = DateUtils.addDays(new Date(), -1); // "now" is now on the last day of the month
}

我用它来生成一个月的数据统计数据。该例程应该在 next 月的第一天运行,以确保捕获完整上一个月的所有数据。

虽然这个问题没有回答在本月最后一天有Cron Expression的意义上的问题,但对于需要运行整整一个月的工作仍然可以解决这个问题。月已经结束。

答案 3 :(得分:-1)

表达式在语法上与您的条件正确相符:0 10 10 L 1/1 ? *

这是您可能感兴趣的解决方法:Workaround for CronSequenceGenerator Last day of month?