Ich versuche, einen Cron-Job innerhalb eines Legacy-Java/Spring/Hibernate-Projekts arbeiten zu lassen, also entschied ich mich, den Spring-Scheduler zu verwenden.Frühling Cron gegen normale Cron?
Ich möchte myTask.doStuff am ersten Sonntag jedes Monats um 12:00 Uhr ausgeführt werden.
In meiner Anwendung-context.xml Ich habe wie meine Task-Scheduler konfiguriert:
<task:scheduled-tasks scheduler="MyTaskScheduler">
<task:scheduled ref="myTask" method="doStuff" cron="0 0 12 ? 1/1 SUN#1 *"/> <!-- Every first Sundy of the month -->
</task:scheduled-tasks>
<task:scheduler id="MyTaskScheduler" pool-size="10"/>
mit dem Problem Cron-Ausdruck selbst das ist: 0 0 12? 1/1 SUN # 1 *
und myTask
ist eine Bean, die eine Methode namens doStuff
hat, die perfekt funktioniert, wenn sie von Komponententests ausgeführt wird.
Wenn ich erstellen und bereitstellen erhalte ich eine bootime Ausnahme von Frühling:
Caused by: java.lang.IllegalArgumentException: cron expression must consist of 6 fields (found 7 in 0 0 12 ? 1/1 SUN#1 *)
at org.springframework.scheduling.support.CronSequenceGenerator.parse(CronSequenceGenerator.java:233)
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:129)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
Da i cron Ausdrücke zum ersten Mal bin mit, meine erste Vermutung war, dass ich etwas falsch mache, aber ich doppelt überprüft mit cronmaker und es gab mir das gleiche Ergebnis.
Alle Dokumentationen sagen: Ein Cron-Ausdruck ist eine Zeichenfolge, die aus sechs oder sieben Unterausdrücken (Feldern) besteht. 1
trotzdem habe ich versucht, den 7. Element Abschlagen (Jahr), da es nicht in einem der Beispiele, und bekam eine andere Fehlermeldung:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.scheduling.config.ScheduledTaskRegistrar#0': Invocation of init method failed; nested exception is java.lang.NumberFormatException: For input string: "0#1"
... tut Unterstützung org.springframework.scheduling ein anderer Geschmack von Cron von allem anderen? the spring-specific documentation sagt nur "Cron-Ausdrücke".
Wie kann ich erreichen, dass dieser Cron-Ausdruck in diesem Kontext wie erwartet funktioniert? Jede Hilfe würde geschätzt werden.
Im Moment wäre meine Lösung sein, diesen Ausdruck zu vereinfachen, um nur jeden Sonntag laufen, und prepend einige Java-Logik zu berechnen, die Sonntag des Monats ist, und sehen, ob das funktioniert - aber diese Art von Niederlagen der Zweck der Konfigurationsansatz und scheint wie ein Antipattern.
Haben Sie 'versucht 0 0 12? * SUN # 1'? (ohne das letzte '*') – Tom
Ja, ich habe eine andere Fehlermeldung bekommen - ich erwähne es wo ich sage "trotzdem habe ich versucht das 7. Element wegzuwerfen" und listet die Fehlermeldung auf. :) – Paul
Spring Scheduler unterstützt nicht zu reiche cron expressionns (nicht sicher, dass es hier der Fall ist), wie Quartz Scheduler tut. Versuchen Sie es mit Quarz –