java java-ee quartz-scheduler

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 ...


Simplemente use la Anotación @DisallowConcurrentExecution en la parte superior de la clase Job.

Vea este example oficial o este tutorial sobre la ejecución simultánea de trabajos.