java - example - quartz scheduler documentation
¿Cómo interrumpir o detener el trabajo de cuarzo actualmente en ejecución? (4)
En Quartz 2.1 con Spring puedes:
@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());
}
}
Tengo algunas tareas que se ejecutan con la ayuda de Java Quartz Jobs, pero necesito detener algunas tareas por alguna condición en mi código. Leí que esto se puede hacer a través de InterruptableJob. Pero no entendí de qué manera debería hacerlo.
La mejor solución en mi opinión es la que se describe en este hilo: http://forums.terracotta.org/forums/posts/list/7700.page
Acabo de introducir un "reposo" después de establecer el indicador de parada en verdadero para permitir que el trabajo finalice 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();
}
No sé por qué nadie mencionó esto, o tal vez no estaba disponible en el momento en que se hizo 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();
Use una bandera o algo para saber cuándo detener la ejecución del trabajo. Entonces use
scheduler.shutdown();
Cómo implementé mi requerimiento:
if(flag==true)
{
scheduler.start();
scheduler.scheduleJob(jobDetail, simpleTrigger);
}
else if(flag==false)
{
scheduler.shutdown();
}
Donde jobDetail y simple Trigger son auto explicativos.
Espero eso ayude. :)
Necesita escribir su trabajo como una implementación de InterruptableJob . Para interrumpir este trabajo, necesita manejar el Scheduler y la interrupt(jobKey<<job name & job group>>)
llamada interrupt(jobKey<<job name & job group>>)
Por favor, eche un vistazo a javadoc para las clases anteriores, también la distribución de cuarzo contiene un ejemplo para esto (ejemplo7).