2012-05-05 18 views
12

Soy muy nuevo en Quartz y tengo algunas dudas sobre el ciclo de vida de los trabajos.cuando se dispara un trabajo de cuarzo, ¿es una nueva instancia de clase de trabajo?

Supongamos que tengo un solo trabajo configurado para hacer algunas cosas.

El trabajo se dispara y finaliza su trabajo. Cuando se activa nuevamente es la misma instancia (tal vez configurada para dormir y activada por el programador) o es una nueva instancia de trabajo (una vez que el trabajo finaliza se cancela y cuando se cumple nuevamente la condición de activación se crea una nueva instancia de trabajo) ?

Hago esta pregunta porque cuando depuro mi aplicación (primavera 3 mvc con soporte de cuarzo) veo nuevas instancias del trabajo y nuevos hilos con SimpleThreadPool $ WorkerThreadRun() abiertos para cada vez que se dispara el trabajo para que SimpleThreadPool Los subprocesos $ WorkerThreadRun() se acumulan y nunca finalizan.

sólo quiero saber si este comportamiento es Allright o estoy obligado a llenar la memoria ;-)

¿Puede alguien darme alguna explicación? Gracias por adelantado.

Respuesta

15

Quartz crea una nueva instancia de su clase de trabajo cada vez que desea activar ese trabajo. Supongamos que tiene cientos de miles de trabajos programados para desencadenarse con poca frecuencia: sería un desperdicio de memoria mantener todos esos trabajos en la memoria.

Sin embargo, si está usando Spring support for Quartz, especialmente el MethodInvokingJobDetailFactoryBean, Spring manejará el ciclo de vida de su trabajo (básicamente llama al método designado de uno de sus beans). Pero parece no ser el caso en tu aplicación.

Por supuesto, una vez que el trabajo está hecho y no hay otras referencias apuntando hacia él (que es el caso normal), el recolector de basura finalmente liberará la memoria ocupada por el trabajo).

Finalmente, sobre los subprocesos: Quartz crea un grupo fijo de subprocesos de trabajo (vea la opción de configuración org.quartz.threadPool.threadCount). Cada vez que ejecuta un trabajo, Quartz puede decidir utilizar un hilo diferente, pero no creará un nuevo hilo por cada activador.

+0

Muchas gracias. ¡Tu explicación es simple y clara y eso es lo que realmente necesitaba! En realidad, en mi aplicación estoy usando 'JobDetailBean',' CronTriggerBean' y 'SchedulerFactoryBean', pero leyendo su respuesta, supongo que el ciclo de vida se maneja también en primavera, sin peligro de errores de memoria. De nuevo. – MaVVamaldo

+0

Acerca de "MethodInvokingJobDetailFactoryBean". Spring manejará el ciclo de vida de su ** bean ** y el método de este bean se llamará desde Quartz-job (implementa la interfaz "org.quartz.Job", hijo de la clase abstracta "QuartzJobBean" en Spring). Y esta instancia de Quartz-job se creará como se describe en mi respuesta. –

+0

Hola @tomasz, ¿podría decirme cómo llamar al método doIt() (por ejemplo, desde Spring docs) al hacer clic en un botón de JSP. Estoy usando el trabajo de Quartz, pero mi método execute() de mi clase de trabajo no se llama geting.Estoy utilizando MethodInvokingJobDetailFactoryBean con algunos desencadenadores y detalles de trabajo con SchedulerFactoryBean pero se invocan en un intervalo de tiempo de reparación no a demanda. Gracias – Jaikrat

3

Escribiré sobre la versión 2.1.5 (última versión), pero también podría ser cierto para otras versiones.

Job -instancia creada por alguna instancia de "JobFactory" con la función "newJob" (SimpleJobFactory, por ejemplo). Llamar a "newJob" ejecutado en "initialize": método de JobRunShell -class. JobRunShell -objeto retenido en la variable local de "QuartzSchedulerThread .run" y no almacenado en ninguna otra lista o campo.

Por lo tanto, nueva Job -instancia creada para cada tiempo de activación y después de la ejecución, será limpiada normalmente por el recolector de basura.

Cuestiones relacionadas