2015-06-17 15 views
13

Sto cercando di ottenere un lavoro cron all'interno di un progetto legacy Java/Spring/Hibernate, quindi ho deciso di utilizzare lo spring scheduler.cron di primavera vs cron normale?

Desidero che myTask.doStuff venga eseguito alle 12:00 della prima domenica di ogni mese.

Nella mia domanda-context.xml Ho configurato il mio compito di pianificazione come:

<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"/> 

con il cron espressione problema stesso è il: 0 0 12? 1/1 SUN # 1 *

e myTask è un fagiolo, che ha un metodo chiamato doStuff che funziona perfettamente quando viene eseguito da test di unità.

Quando ho creare e distribuire ottengo un'eccezione bootime dalla primavera:

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) 

Dato che sto usando espressioni di cron per la prima volta, la mia prima ipotesi era che stavo facendo qualcosa di sbagliato, ma io doppio controllato usando cronmaker e mi ha dato lo stesso risultato.

Tutte le documentazioni dicono: Un'espressione cron è una stringa composta da sei o sette sottoespressioni (campi). 1

nonostante questo ho provato a bussare fuori l'elemento 7 ° (anno) dal momento che non è in nessuno degli esempi, e ottenuto un messaggio di errore diverso:

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" 

... fa org.springframework.scheduling supporto un diverso sapore di cron da tutto il resto? the spring-specific documentation dice semplicemente 'cron espressioni'.

Come posso ottenere che questa espressione di cron funzioni come previsto in questo contesto? Qualsiasi aiuto sarebbe apprezzato.

Al momento la mia soluzione potrebbe essere quella di semplificare questa espressione basta eseguire ogni Domenica, e anteporre una logica Java per calcolare quale Domenica del mese che è, e vedere se funziona - ma questo genere di sconfitte lo scopo dell'approccio alla configurazione e sembra un antipattern.

+0

Hai provato '0 0 12? * SUN # 1? (senza l'ultimo '*') – Tom

+0

Sì, ho ricevuto un messaggio di errore diverso - lo menziono dove dico "nonostante ciò ho provato a spegnere il settimo elemento" ed elencare il messaggio di errore. :) – Paul

+0

Lo Spring Scheduler non supporta espressioni di cron troppo ricche (non è sicuro che sia il caso qui), come fa Quartz Scheduler. Provalo con il quarzo –

risposta

27

Spring Le attività pianificate non sono nello stesso formato delle espressioni cron.

Non seguono lo stesso formato delle espressioni cron UNIX.

Esistono solo 6 campi: secondo, minuto, ora, giorno del mese, mese, giorno/i della settimana. Asterisco (*) significa corrispondere a qualsiasi. */X significa "ogni X" (vedi esempi). I giorni numerici della settimana non funzionano per me. Inoltre, "MON-FRI" è molto più facile da leggere. Ecco alcune espressioni di esempio:

"0 0 18 * * MON-FRI" indica ogni giorno della settimana alle 18:00.

"0 0 */1 * * *" significa ogni ora dell'ora.

"0 0 */8 * * *" significa ogni 8 ore nell'ora.

"0 0 12 1 * *" significa 12:00 PM il primo giorno di ogni mese.

Qui puoi trovare alcune informazioni aggiuntive: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html

Inoltre è possibile trovare la documentazione utile a molla: http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/scheduling.html