2015-03-05 18 views
6

Sto utilizzando un Quartz Job per l'esecuzione di attività specifiche.Job programmato Quartz Java: non consente l'esecuzione concomitante di Job

Sto pianificando anche la sua esecuzione nella mia classe di applicazione principale e quello che sto cercando di realizzare non è quello di consentire l'esecuzione simultanea di istanze di questo lavoro.

Quindi lo scheduler deve eseguire il lavoro solo se l'istanza precedente è terminata.

Ecco la mia classe di lavoro:

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 .... <<<<<<<<<<<<<<<<<<<<"); 

    } 
} 

Quindi, in classe principale della mia applicazione sto iniziando lo scheduler:

... 
//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); 

} 

Vorrei evitare che scheduler di avviare una seconda istanza MainJob se un altro uno è ancora in esecuzione ...

risposta

13

Basta usare l'annotazione @DisallowConcurrentExecution sopra la classe Lavoro.

Vedere questo ufficiale example o questo tutorial sull'esecuzione di lavoro simultaneo.

2

È possibile implementare StatefulJob o annotare DisallowConcurrentExecution

+0

StatefulJob è deprecato (non so se era 05.2015). DisallowConcurrentExecution e/o PersistJobDataAfterExecution è la strada da percorrere. – aProgger