2011-12-12 26 views
6

He codificado a continuación el código en el que estoy ejecutando dos trabajos. Primero con el intervalo de 10 segundos y el otro con el intervalo de 3 segundos. Pero finalmente, en algún momento, se ejecutarán al mismo tiempo. ¿Existe algún mecanismo para evitar esta situación¿Cómo evitar dos trabajos que se ejecutan al mismo tiempo en Quartz?

JobDetail jDetail = new JobDetail("Job1", "group1", MyJob.class); 
    CronTrigger crTrigger = new CronTrigger("cronTrigger", "group1", "0/10 * * * * ?"); 
    sche.scheduleJob(jDetail, crTrigger); 

    jDetail = new JobDetail("Job2","group2",MyJob2.class); 
    crTrigger = new CronTrigger("cronTrigger2","group2","0/3 * * * * ?"); 
    sche.scheduleJob(jDetail, crTrigger); 
+0

¿Está tratando de asegurarse de que el trabajo no se ejecutará dos veces dentro de la misma JVM o dentro de varias JVM? Además, ¿cuánto tiempo lleva cada tarea? ¿Son subsecond, varios segundos, algunos minutos? – Bill

Respuesta

2

Se puede crear un objeto de ayuda para que los dos puestos de trabajo sincronizado:

//In the base class 
public static Object lock = new Object(); 

//In the first class 
public void execute() { 
    synchronized(lock) { 
     //do stuff 
    } 
} 

//In the second class 
public void execute() { 
    synchronized(lock) { 
     //do stuff 
    } 
} 

Más información acerca de la sincronización en: http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

+1

pero el OP dijo que él maneja dos clases diferentes, esto no resolverá su situación –

+0

@AngeloNeuschitzer tiene toda la razón, no entendió que había diferentes clases para el trabajo. –

3

No completamente responder su pregunta, pero así es como puede consultar algo que se ejecute de manera segura para hilos:

//sched is your org.quartz.Scheduler 
     synchronized (sched) { 
      JobDetail existingJobDetail = sched.getJobDetail(jobName, jobGroup); 
      if (existingJobDetail != null) { 
       List<JobExecutionContext> currentlyExecutingJobs = (List<JobExecutionContext>) sched.getCurrentlyExecutingJobs(); 
       for (JobExecutionContext jec : currentlyExecutingJobs) { 

        if (existingJobDetail.equals(jec.getJobDetail())) { 
         // This job is currently executing 
        } 
       } 
      } 
+0

¡buena idea usar el programador como objeto de observación! –

0

Ha intentado:

org.quartz.jobStore.isClustered: true 

Alternativamente, usted hace su trabajo en un trabajo con estado (y establecer isClustered en true), y que shoujld a resolver su problema. (Oops, StatefulJob está en desuso, use DisallowConcurrentExecution).

Cuestiones relacionadas