2013-01-15 16 views
5

Sto lavorando a un progetto con Quartz e si è verificato un problema con le dipendenze con i lavori.Quartz Dipendenza lavori

abbiamo una configurazione in cui A e B non dipendono vicenda, sebbene C è:

A e B può funzionare allo stesso tempo, ma C può funzionare solo quando entrambi A e B sono completi.

C'è un modo per impostare questo tipo di scenario in Quartz, in modo che C si inneschi solo quando A e B finiscono?

risposta

5

penso che questo sia il modo corrente per farlo: http://www.quartz-scheduler.org/documentation/faq#FAQ-chain

Sulla base di questa FAQ, è possibile creare un ascoltatore lavoro che attende per A e B per finire, e quindi pianificare Job C una volta che succede.

PS: Ecco il testo nel caso in cui i collegamenti modifiche:

Come faccio a catena di esecuzione del lavoro? O come posso creare un flusso di lavoro?

Attualmente non esiste un modo "diretto" o "libero" per attivare i trigger con Quarzo. Tuttavia ci sono diversi modi per realizzarlo senza troppi sforzi. Di seguito è riportato uno schema di un paio di approcci:

Un modo è quello di utilizzare un listener (vale a dire un TriggerListener, JobListener o SchedulerListener) che può notare il completamento di un processo/trigger e quindi pianificare immediatamente un nuovo trigger da attivare. Questo approccio può essere un po 'complicato, dal momento che dovrete informare l'ascoltatore a quale lavoro seguirà quale - e potrebbe essere necessario preoccuparsi della persistenza di queste informazioni. Vedi listener org.quartz.listeners.JobChainingJobListener che viene fornito con Quartz - poiché ha già alcune di queste funzionalità.

Un altro modo è quello di costruire un lavoro che contiene nel suo JobDataMap il nome del lavoro successivo al fuoco, e come completa il lavoro (l'ultimo passo nel suo metodo execute()) hanno il compito pianificare il lavoro successivo. Diverse persone lo stanno facendo e hanno avuto fortuna. La maggior parte ha creato una classe base (astratta) che è un lavoro che sa come ottenere il nome del lavoro e il gruppo da JobDataMap utilizzando le chiavi predefinite (costanti) e contiene il codice per pianificare il lavoro identificato. L'implementazione astratta di Job di execute() delegata ad un metodo di template astratto come "doWork()" (dove va a finire il vero lavoro della classe Job) e poi contiene il codice per la pianificazione del lavoro di follow-up. Quindi fanno semplicemente estensioni di questa classe che include il lavoro che il lavoro dovrebbe svolgere. L'uso di lavori "durevoli" o il metodo addJob sovraccarico (JobDetail, booleano, booleano) (aggiunto in Quartz 2.2) aiuta l'applicazione a definire tutti i lavori contemporaneamente con i dati corretti, senza creare ancora trigger per attivarli (diversi da un grilletto per sparare il primo lavoro nella catena).

In futuro, Quartz fornirà un modo molto più semplice per farlo, ma fino ad allora, dovrai utilizzare uno degli approcci sopra, o pensare a un altro che funzioni meglio per te.