Trabajo programado de Java Quartz: no permitir la ejecución concurrente de Job
java-ee quartz-scheduler (3)
Puede implementar StatefulJob o anotar DisallowConcurrentExecution
Estoy usando un trabajo de cuarzo para ejecutar tareas específicas.
También estoy programando su ejecución en mi clase de aplicación Principal y lo que estoy tratando de lograr es no permitir que se ejecuten instancias simultáneas de este trabajo.
Por lo tanto, el planificador solo debe ejecutar el trabajo si su instancia anterior ha finalizado.
Aquí está mi clase de trabajo:
public class MainJob implements Job {
static Logger log = Logger.getLogger(MainJob.class.getName());
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
GlobalConfig cfg = new GlobalConfig();
ProcessDicomFiles processDicomFiles = new ProcessDicomFiles();
ProcessPdfReportFiles processPdf = new ProcessPdfReportFiles();
try {
log.info("1. ---- SCHEDULED JOB -- setStudiesReadyToProcess");
processDicomFiles.setStudiesReadyToProcess();
log.info("2. ---- SCHEDULED JOB --- distributeToStudies");
processDicomFiles.distributeToStudies(cfg.getAssocDir());
...
//process any incoming PDF file
log.info("11. ---- SCHEDULED JOB --- processPdfFolder");
processPdf.processPdfFolder();
} catch (Exception ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.ERROR, null, ex);
}
log.info(">>>>>>>>>>> Scheduled Job has ended .... <<<<<<<<<<<<<<<<<<<<");
}
}
Entonces, en la clase principal de mi aplicación, estoy comenzando el planificador:
...
//start Scheduler
try {
startScheduler();
} catch (SchedulerException ex) {
log.log(Level.INFO, null, ex);
}
...
public void startScheduler () throws SchedulerException {
//Creating scheduler factory and scheduler
factory = new StdSchedulerFactory();
scheduler = factory.getScheduler();
schedulerTimeWindow = config.getSchedulerTimeWindow();
JobDetailImpl jobDetail = new JobDetailImpl();
jobDetail.setName("First Job");
jobDetail.setJobClass(MainJob.class);
SimpleTriggerImpl simpleTrigger = new SimpleTriggerImpl();
simpleTrigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
simpleTrigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
simpleTrigger.setRepeatInterval(schedulerTimeWindow);
simpleTrigger.setName("FirstTrigger");
//Start scheduler
scheduler.start();
scheduler.scheduleJob(jobDetail,simpleTrigger);
}
Me gustaría evitar que el planificador inicie una segunda instancia de MainJob si todavía se está ejecutando otra ...
@DisallowConcurrentExecution
puede hacer tu trabajo, pero ten en cuenta que solo evitará que tu clase se ejecute dos veces en el mismo nodo.
Consulte el comentario de @ReneM en el planificador múltiple Quartz 2.2 y @DisallowConcurrentExecution