2012-02-06 9 views
12

me gustaría aclarar los detalles de los scheduler.getCurrentlyExecutingJobs() en Quartz1.6. Tengo un trabajo que debería tener solo una instancia ejecutándose en un momento dado. Se puede activar para "ejecutar ahora" desde una interfaz de usuario, pero si ya se está ejecutando una instancia de trabajo para este trabajo, no debería pasar nada.encontrar un trabajo si se está ejecutando en Quartz1.6

Éste es cómo comprobar si se está ejecutando una tarea que me interesa:

List<JobExecutionContext> currentJobs = scheduler.getCurrentlyExecutingJobs(); 
    for (JobExecutionContext jobCtx: currentJobs){ 
    jobName = jobCtx.getJobDetail().getName(); 
    groupName = jobCtx.getJobDetail().getGroup(); 
    if (jobName.equalsIgnoreCase("job_I_am_looking_for_name") && 
     groupName.equalsIgnoreCase("job_group_I_am_looking_for_name")) { 
     //found it! 
     logger.warn("the job is already running - do nothing"); 
    }    
} 

entonces, para probar esto, tengo una prueba de unidad que intenta programar dos instancias de este trabajo, uno tras otro . Yo estaba esperando a ver el aviso cuando se trata de programar el segundo trabajo, sin embargo, en su lugar, estoy recibiendo esta excepción:

org.quartz.ObjectAlreadyExistsException: Unable to store Job with name: 
'job_I_am_looking_for_name' and group: 'job_group_I_am_looking_for_name', 
because one already exists with this identification. 

Cuando corro esta prueba de la unidad en un modo de depuración, con la ruptura de esta línea :

Lista currentJobs = scheduler.getCurrentlyExecutingJobs();

veo la la lista está vacía - por lo que el planificador no ve este trabajo como correr, pero sigue sin programar de nuevo - lo cual me dice que el trabajo ya estaba hecho ejecutando en el momento ...

¿Me faltan algunos puntos más finos con este método del planificador?

Gracias!

Marina

Respuesta

18

Para el beneficio de los demás, Quiero poner una respuesta a la cuestión que estaba teniendo - Recibí ayuda de del Foro de terracota Zemian Deng: posting on Terracotta's forum

Aquí es la recapitulación: La comprobación real de los trabajos en ejecución funcionaba bien, simplemente era el tiempo en las pruebas de la Unidad, por supuesto. He añadido algo de descanso en el trabajo, y modifiqué las pruebas unitarias para programar el segundo trabajo mientras el primero aún se está ejecutando, y verifiqué que podía encontrar el primer trabajo todavía en ejecución.

La excepción que estaba recibiendo era porque yo estaba tratando de programar un nuevo trabajo con el mismo nombre, en lugar de tratar de disparar la ya almacenada en el trabajo del planificador. El siguiente código funcionó exactamente como yo necesitaba:

List<JobExecutionContext> currentJobs = scheduler.getCurrentlyExecutingJobs(); 
for (JobExecutionContext jobCtx: currentJobs){ 
    jobName = jobCtx.getJobDetail().getName(); 
    groupName = jobCtx.getJobDetail().getGroup(); 
    if (jobName.equalsIgnoreCase("job_I_am_looking_for_name") && groupName.equalsIgnoreCase("job_group_I_am_looking_for_name")) { 
     //found it! 
     logger.warn("the job is already running - do nothing"); 
       return; 
    }    
} 
     // check if this job is already stored in the scheduler 
JobDetail emailJob; 
emailJob = scheduler.getJobDetail("job_I_am_looking_for_name", "job_group_I_am_looking_for_name"); 
if (emailJob == null){ 
     // this job is not in the scheduler yet 
    // create JobDetail object for my job 
    emailJob = jobFactory.getObject(); 
    emailJob.setName("job_I_am_looking_for_name"); 
    emailJob.setGroup("job_group_I_am_looking_for_name"); 
    scheduler.addJob(emailJob, true);    
} 

// this job is in the scheduler and it is not running right now - run it now 
scheduler.triggerJob("job_I_am_looking_for_name", "job_group_I_am_looking_for_name"); 

Gracias! Marina

+1

Ten en cuenta que 'getCurrentlyExecutingJobs()' método no es compatible con clústeres, por lo que va a funcionar si el uso de un solo nodo única configuración de cuarzo. – Marboni

+0

¡gracias por el consejo útil! – Marina

Cuestiones relacionadas