1

我想在每个月的第三个星期日触发触发器。在 cron 表达式中,我使用了 cron="0 0 23 ? * 1#3" 但它给了我异常

java.lang.NumberFormatException: For input string: "1#3"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.valueOf(Unknown Source)
    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.parse(CronSequenceGenerator.java:241)
    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 org.springframework.scheduling.config.ScheduledTaskRegistrar.afterPropertiesSet(ScheduledTaskRegistrar.java:188)
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.onApplicationEvent(ScheduledAnnotationBeanPostProcessor.java:209)
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.onApplicationEvent(ScheduledAnnotationBeanPostProcessor.java:1)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:324)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:929)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:467)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4765)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5260)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1525)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1515)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

这是我正在尝试的代码

@Scheduled(cron="0 0 23 ? * 1#3") // Fire at 11 PM on the third sunday of every month
    public void sendReportNotCreatedNotificationToStudent() throws Exception{
        scheduleNotificationIntf.sendScheduleNotificationToStudent("createReportRemainder.html");
    }

请任何人告诉这个错误。我怎样才能实现这个 Cron 表达式。

4

4 回答 4

5

我可能来晚了一点,但我碰巧遇到了同样的问题,我有一个解决方法。我已经测试过了,它可以工作!这个表达式:

@Scheduled(cron="0 0 23 1-7 * WED") // First wednesday of the month at 23:00

将在本月的第一个星期三运行。解释很简单:第一个星期三总是在 1-7 范围内的一天,所以如果我们将一个月中的一天过滤到 1 到 7 之间,并且将工作日过滤到星期三,我们就完成了 :)我还没有测试过,但是使用相同的逻辑,这些表达式也应该可以工作:

@Scheduled(cron="0 0 23 8-14 * WED") // Second wednesday of the month at 23:00
@Scheduled(cron="0 0 23 15-21 * WED") // Third wednesday of the month at 23:00
@Scheduled(cron="0 0 23 22-28 * WED") // Fourth wednesday of the month at 23:00
@Scheduled(cron="0 0 23 29-31 * WED") // Fifth wednesday of the month at 23:00

我希望它有帮助!

于 2013-10-18T10:33:41.263 回答
1

Spring 似乎不支持您使用的 cron 条目语法。显然,Spring 3.x 仅支持“经典​​”cron 条目格式……如crontab(5)手册条目中所述。请注意,不支持“x#y”语法。另请参阅SpringCronSequenceGenerator的 javadoc 。

但是您使用的语法似乎是Quartz crontab 表达式语法。


更新

对Spring 3.2.1 中的源代码的简要检查CronSequenceGenerator没有迹象表明支持字段 6 中的“#”。确实,行号与您的堆栈跟踪匹配,所以我相信以下答案是确定的。

我怎样才能实现这个 Cron 表达式。

你不能用春天。Spring 不支持这种 Cron 表达式。如果你想使用那种表达式,你将不得不切换到使用 Quartz 调度器。

于 2013-06-28T05:08:50.310 回答
0

你应该试试这个表达0 0 12 ? 1/1 SUN#3 *

于 2013-06-28T04:43:06.397 回答
-1

尝试使用石英调度程序而不是弹簧调度程序。 http://quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-06

于 2013-06-28T05:51:05.537 回答