2015-06-17 20 views
13

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.

+0

Haben Sie 'versucht 0 0 12? * SUN # 1'? (ohne das letzte '*') – Tom

+0

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

+0

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 –

Antwort

27

Spring Geplante Tasks haben nicht dasselbe Format wie Cron-Ausdrücke.

Sie folgen nicht dem gleichen Format wie UNIX-Cron-Ausdrücke.

Es gibt nur 6 Felder: Sekunde, Minute, Stunde, Tag des Monats, Monat, Wochentag (e). Sternchen (*) bedeutet, dass alle übereinstimmen. */X bedeutet "jedes X" (siehe Beispiele). Numerische Tage der Woche funktionieren nicht für mich. Außerdem ist "MON-FRI" viel einfacher zu lesen. Hier einige Beispielausdrücke:

"0 0 18 * * MON-FRI" bedeutet jeden Wochentag um 18:00 Uhr.

"0 0 */1 * * *" bedeutet jede Stunde zu jeder vollen Stunde.

"0 0 */8 * * *" bedeutet alle 8 Stunden zu jeder vollen Stunde.

"0 0 12 1 * *" bedeutet 12:00 Uhr am ersten Tag eines jeden Monats.

Hier können Sie einige zusätzliche Informationen finden: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html

Auch Sie können die Feder Dokumentation nützlich finden: http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/scheduling.html