2013-04-08 10 views
5

Ho il prossimo lavoro al quarzo in un'applicazione Grails. Il lavoro calcola alcune statistiche e invia ed e-mail con queste statistiche. Voglio che il lavoro venga eseguito ogni giorno alle 7 in punto.Lavoro al quarzo in un'applicazione Grails attivata tre volte

Il mio problema è il lavoro istriggerato tre volte al giorno anziché una sola volta.

class DailyEmailJob { 
    def eventService 

    static triggers = { 
     cron name: 'emailTrigger', cronExpression: "0 0 7 * * ?" 
    } 

    def execute() { 
     eventService.send24StatsEmail() 
    } 
} 

Sto ospitando l'applicazione Grails in Apache Tomcat/7.0.35, in esecuzione Grails 2.2.1 e quarzo-1.0-RC6

+0

Dove lo stai ospitando? Ho riscontrato problemi simili ... – marko

+0

L'app è installata su un solo server di app? –

+0

Lo sto ospitando su Rimuhosting.com in VPS. L'applicazione è appena installata in un tomcat –

risposta

2

L'espressione cron sembra OK. Le funzionalità di distribuzione automatica di Tomcat potrebbero essere il colpevole. Per alcuni suggerimenti, vedi: https://stackoverflow.com/a/11990221

+0

Ho aggiunto un deployOnStartup = "false" autoDeploy = "false" e oggi si attiva solo due volte. Potrebbe perché ho la guerra e la directory sotto $ CATALINA_HOME/webapps –

+0

Sì, questo potrebbe spiegarlo. Credo che il comportamento dipenda anche dal modo in cui il 'Context' dell'applicazione è definito (cioè in' server.xml'? Nel proprio file '.xml' sotto' conf \ Catalina \ localhost'?) In ogni caso, prova a spostare il tuo file .war su webapps; Credo che aiuterà. –

+0

Ho lo stesso problema e non sono sicuro se questa è la causa .. Il mio lavoro si attiva sempre * tre * volte. Perché non * due * o * quattro *? @SergiodelAmo –

1

Questo è ciò che i documenti dicono

In entrambi i Day- di-Week o Day-of-Month deve essere "?", o si otterrà un errore poiché il supporto della libreria sottostante non è completo. Quindi non è possibile specificare entrambi i campi, né lasciare entrambi come carattere jolly di tutti i valori "*"; questo è un punto di partenza dalla specifica unix crontab.

Speranza che aiuta

2

EDIT

Il sotto analisi non non tenere bene in questo scenario. Questa era solo un'ipotesi basata su fatti grezzi e incompresi. Se consigliato, posso rimuovere la risposta.

FINE

spero di poter rispondere alla mia domanda ho chiesto nel commento.

"Quali sono i tempi si innesca diverso 07:00?"

E '07:00, 14:00 e 21:00?

Motivo:

  • si riferiscono alla versione del plug-in quartz [quarzo-1.0-RC6] che utilizza org.quartz-scheduler:quartz:1.8.4. Fare riferimento a BuildConfig.groovy from Github.
  • Seguire l'API CronExpression dall'adeguato Javadoc.

Evidenziando la verbosità importante: -

"Il carattere '/' viene utilizzato per specificare incrementi Per esempio "0/15" nel campo dei secondi significa" i secondi 0, 15, 30 e 45 "e" 5/15 "nel campo secondi significa" i secondi 5, 20, 35 e 50 ". Specificare '*' prima che '/' sia equivalente alla specifica di 0 è il valore da cui iniziare In sostanza, per ogni campo nell'espressione esiste un insieme di numeri che possono essere attivati ​​o disattivati ​​Per i secondi ei minuti, i numeri vanno da 0 a 59. Per le ore da 0 a 23, per i giorni del mese da 0 a 31 e per i mesi da 1 a 12. La sim del carattere "/" piega ti aiuta ad accendere ogni "ennesimo" valore nel set dato. Quindi "7/6" nel campo mese gira solo il mese "7", NON significa ogni 6 ° mese, si prega di notare che sottigliezza. "

Nel tuo caso l'espressione cron: "0 0 7 * * ?" risultati nella gestione del lavoro ogni 7 ore in 24 ore (al giorno) con conseguente esecuzione alle 7 del mattino, (7 + 7) 02:00, (7 + 7 + 7) 09:00.

Questo ultimi documenti da quartz-scheduler.org dire il contrario. Date un'occhiata agli esempi here. studiano anche il "Carattere speciale /".

sulla base delle mie prove su seconds e minutes [non l'ho fatto voglio aspettare 24 ore per testare :)], penso fermamente che il sotto cronExpression funzionerà e attiverà il execute() esattamente 7:00 Hrs ogni giorno:

Risposta:

  1. "0 0 7/23 * * ?" [eseguire il lavoro ogni 24 ore a partire da 7 ora 0a minuti e secondi 0a del giorno]
  2. "0 0 0/23,7 * * ?" [sinonimo di rispondi 1 ma meno dettagliato.]

Informati sui risultati del test. Credo fermamente che funzionerà. Sto anche impostando lo scheduler per il giorno/notte per testare i risultati dopo 24 ore (non voglio manomettere l'orologio JVM per ottenere un risultato chiaro, anche se ho provato con successo a fare lo stesso tamper). . Pubblicheremo i risultati del mio test effettivo.

+0

Non si attiva in tre momenti diversi. Si innesca alle sette in punto tre volte in un paio di secondi –

+0

L'espressione cron è perfetta, verificata in base ai documenti che hai menzionato anche, non fuorviare. Prova su http://www.cronmaker.com/ – Kartikya

+0

Hai già utilizzato il plug-in di quarzo Grails? – dmahapatro

Problemi correlati