2011-08-23 19 views

Respuesta

33

Necesita escribir su trabajo como una implementación de InterruptableJob. Para interrumpir este trabajo, es necesario manejar a Scheduler, y llamar a interrupt(jobKey<<job name & job group>>)

Por favor, tienen una mirada @ Javadoc para las clases anteriores, también cuarzo de distribución contiene un ejemplo para esto (Ejemplo 7).

+0

Thx))))))))))) – user253202

+1

La limitación de este enfoque es ** no ** consciente del clúster. Java doc: * Este método no es compatible con clústeres. Es decir, solo interrumpirá instancias de InterruptableJob identificado que se estén ejecutando actualmente en esta instancia de Scheduler, no en todo el clúster. * –

4

En Cuarzo 2.1 con la primavera se puede:

@Autowired 
private Scheduler schedulerFactoryBean; //injected by spring 
... 
... 

List<JobExecutionContext> currentlyExecuting = schedulerFactoryBean.getCurrentlyExecutingJobs(); 

//verifying if job is running  
for (JobExecutionContext jobExecutionContext : currentlyExecuting) { 
    if(jobExecutionContext.getJobDetail().getKey().getName().equals("JobKeyNameToInterrupt")){ 
     result = schedulerFactoryBean.interrupt(jobExecutionContext.getJobDetail().getKey()); 
    } 
} 
2

La mejor solución en mi opinión es el que se describe en este tema: http://forums.terracotta.org/forums/posts/list/7700.page

yo sólo he introducido un "sueño" después de la parada conjunto marcar a verdadero para permitir que el trabajo termine limpiamente.

@Override 
public void interrupt() throws UnableToInterruptJobException { 
    stopFlag.set(true); 
    try { 
     Thread.sleep(30000); 
    } catch (InterruptedException e) { 
     //logger.error("interrupt()", e); 
    } 
    Thread thread = runningThread.getAndSet(null); 
    if (thread != null) 
     thread.interrupt(); 
} 
2

No sé por qué nadie mencionó esto, o tal vez esto no estaba disponible en el momento en que se realizó la pregunta.

Hay un método llamado shutdown para una instancia de Scheduler.

SchedulerFactory factory = new StdSchedulerFactor(); 
Scheduler scheduler = factory.getScheduler(); 

Lo anterior se utiliza para iniciar un trabajo como

scheduler.start(); 

uso de una bandera o algo para saber cuándo hay que parar la tarea no se ejecute. A continuación, utilice

scheduler.shutdown(); 

Cómo he implementado mis requisitos:

if(flag==true) 
    { 
     scheduler.start(); 
     scheduler.scheduleJob(jobDetail, simpleTrigger); 
    } 
    else if(flag==false) 
    { 
     scheduler.shutdown(); 
    } 

Dónde jobDetail y simpleTrigger son explica por sí mismo.

Espero que ayude. :)

+7

Esta solución está cerrando todo el planificador, lo que no es realmente correcto a menos que tenga un trabajo asignado al planificador. Debería tener una forma de eliminar solo el trabajo específico, no el planificador completo, ya que es posible tener más de un trabajo ejecutándose en el mismo planificador. – Salman

Cuestiones relacionadas