2010-05-13 16 views
9

Tengo un trabajo de Quartz que ya ha sido programado. Quiero actualizar el JobDataMap asociado con él. Si obtengo un JobDataMap con JobDataMap jobDataMap = scheduler.getJobDetail(....).getJobDataMap(), ¿ese mapa es "en vivo"? es decir. si lo cambio, ¿persistirá en el programador? Si no, ¿cómo lo persisto?Actualizar una JobDataMap existente

Respuesta

6

Ver http://www.quartz-scheduler.org/docs/tutorial/TutorialLesson03.html:

Una instancia de trabajo puede definirse como "estado" o "no stateful". Los trabajos no declarados solo tienen su JobDataMap almacenado en el momento en que son agregados al programador. Esto significa que cualquier cambio realizado en el contenido del mapa de datos del trabajo durante la ejecución del trabajo se perderá, y no se verá en el trabajo la próxima vez que se ejecute .

... un trabajo con estado es todo lo contrario - su JobDataMap se vuelve a almacenar después de cada ejecución del trabajo.

Usted 'marca' un trabajo como con estado al tener que implementar la interfaz StatefulJob , en lugar de la interfaz de de empleo.

+1

pero ¿qué ocurre si quiero actualizar un trabajo desde fuera de una ejecución? p.ej. de JMX? –

12

Tuve un problema similar: tengo un segundo activador que activa un trabajo con estado que funciona en una cola en el mapa de datos del trabajo. Cada vez que se dispara el trabajo, sondea desde la cola y realiza algún trabajo en el elemento encuestado. Con cada ejecución de trabajo, la cola tiene un elemento menos (la cola se actualiza correctamente desde el trabajo). Cuando la cola está vacía, el trabajo se programa por sí mismo.

Quería poder actualizar externamente la lista de argumentos de un trabajo/activador en curso para proporcionar más argumentos a la cola. Sin embargo, solo recuperar el mapa de datos y actualizar la cola no fue suficiente (la siguiente ejecución muestra que la cola no está actualizada). El problema es que Quartz solo actualiza el mapa de datos de trabajo de una instancia de trabajo después de la ejecución.

Aquí está la solución que encontré:

JobDetail jobDetail = scheduler.getJobDetail("myJob", "myGroup"); 
jobDetail.getJobDataMap.put("jobQueue", updatedQueue); 
scheduler.addJob(jobDetail, true); 

La última línea indica a cuarzo para reemplazar el trabajo almacenado con la persona que está proporcionando. La próxima vez que se active el trabajo, verá la cola actualizada.

+0

Parece que hay un problema con la última versión de Quartz (2.6.10?) –

+0

Lo sentimos, esa es la versión 2.1.7 ... funcionó bien con 2.1.6 anteriormente –

24

En cuarzo 2.0. StatefulJob está en desuso. Para conservar el mapa de datos del trabajo, use @PersistJobDataAfterExecution en la clase de trabajo. Por lo general, va con @DisallowConcurrentExecution.

+0

Gracias por la información Bozho. –

+0

Pero en qué tabla podemos encontrar la información de JobDataMap, revisé todas las tablas pero no las encontré. –

+0

¿Son las columnas Job_data de la tabla QRTZ_JOB_DETAILS? –

Cuestiones relacionadas