2012-05-05 11 views
12

Sono molto nuovo a Quartz e ho qualche dubbio sul ciclo di vita del lavoro.quando un lavoro al quarzo si attiva, è una nuova istanza della classe di lavoro?

Supponiamo di avere un singolo lavoro configurato per fare alcune cose.

Il lavoro spara e termina il suo lavoro. Quando scocca di nuovo è la stessa istanza (forse impostata per dormire e risvegliare dallo scheduler) o è una nuova istanza di lavoro (una volta che il lavoro termina viene ucciso e quando la condizione di innesco viene soddisfatta di nuovo viene creata una nuova istanza di lavoro) ?

Mi pongo questa domanda perché quando eseguo il debug dell'applicazione (spring 3 mvc con supporto al quarzo) vedo nuove istanze del lavoro e nuovi thread con SimpleThreadPool $ WorkerThreadRun() aperto per ogni volta che il lavoro viene generato in modo che SimpleThreadPool I thread $ WorkerThreadRun() sono accumulati e non vengono mai terminati.

Voglio solo sapere se questo comportamento è allright o sono costretto a riempire la memoria ;-)

Qualcuno mi può dare qualche spiegazione? Grazie in anticipo.

risposta

15

Quartz crea una nuova istanza della classe di lavoro ogni volta che desidera attivare quel lavoro. Supponiamo di avere centinaia di migliaia di lavori programmati per attivarsi molto raramente: sarebbe uno spreco di memoria mantenere tutti quei lavori in memoria.

Tuttavia se si utilizza Spring support for Quartz, in particolare lo MethodInvokingJobDetailFactoryBean, Spring gestirà il ciclo di vita del lavoro (in pratica chiama il metodo designato di uno dei propri bean). Ma non sembra essere il caso nella tua applicazione.

Ovviamente dopo che il lavoro è terminato e nessun altro riferimento lo sta puntando (che è il caso normale) il garbage collector rilascerà la memoria occupata dal lavoro).

Infine sui thread - Quartz crea un pool di thread di lavoro fisso (vedere l'opzione di configurazione org.quartz.threadPool.threadCount). Ogni volta che esegui un lavoro, Quartz può decidere di utilizzare un thread diverso, ma non creerà un nuovo thread per ogni trigger.

+0

Grazie mille. La tua spiegazione è semplice e chiara ed è quello di cui avevo davvero bisogno! In realtà nella mia applicazione sto usando 'JobDetailBean',' CronTriggerBean' e 'SchedulerFactoryBean', ma leggendo la tua risposta suppongo che il ciclo di vita sia gestito anche dalla primavera, senza alcun pericolo di difetti di memoria. Thnks di nuovo. – MaVVamaldo

+0

Informazioni su "MethodInvokingJobDetailFactoryBean". Spring gestirà il ciclo di vita del ** bean ** e il metodo di questo bean verrà chiamato da Quartz-job (implementa l'interfaccia "org.quartz.Job", figlio della classe astratta "QuartzJobBean" in primavera). E questa istanza di lavoro Quartz verrà creata come descritto nella mia risposta. –

+0

Ciao @tomasz, potresti dirmi come chiamare il metodo doIt() (ad es. Dai documenti di Spring) al clic di un pulsante da JSP. Sto usando Quartz, ma il mio metodo execute() della mia classe Job non viene richiamato.Sto usando MethodInvokingJobDetailFactoryBean con alcuni trigger e jobDetails con SchedulerFactoryBean ma vengono chiamati su alcuni intervalli di tempo di riparazione non su richiesta. Grazie – Jaikrat

3

Scriverò sulla versione 2.1.5 (ultima versione), ma potrebbe anche essere vero per altre versioni.

Job -instance creato da qualche caso di "JobFactory" con-funzione "newJob" (SimpleJobFactory, per esempio). Chiama a "newJob" eseguito in "initialize" -method of JobRunShell -class. JobRunShell -oggetto tenuto nella variabile locale "QuartzSchedulerThread .run" e non memorizzato in nessun altro elenco o campo.

Quindi, nuovo Job - istanza creata per ogni tempo di attivazione e dopo l'esecuzione verrà ripulita normalmente dal garbage collector.

Problemi correlati