2015-03-05 14 views
6

Ich verwende einen Quartz-Job zum Ausführen bestimmter Aufgaben.Java Quartz geplanter Job - gleichzeitige Ausführung von Job nicht zulassen

Ich plane auch die Ausführung in meiner Hauptanwendungsklasse und was ich versuche zu erreichen, ist es nicht zuzulassen, dass simultane Instanzen dieses Jobs ausgeführt werden.

Also sollte der Scheduler den Job nur ausführen, wenn seine vorherige Instanz beendet ist.

Hier ist meine Jobklasse:

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

    } 
} 

So in Hauptklasse meiner Anwendung ich den Scheduler bin ab:

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

} 

Ich mag würde Scheduler verhindern, dass eine zweite MainJob Instanz, wenn ein anderen Ausgang einer läuft noch ...

Antwort

13

Verwenden Sie einfach die @DisallowConcurrentExecution Annotation über der Jobklasse.

Siehe diese offizielle example oder diese tutorial über gleichzeitige Jobausführung.

2

Sie können StatefulJob implementieren oder mit Anmerkungen versehen DisallowConcurrentExecution

+0

StatefulJob veraltet ist (weiß nicht, ob es 05,2015 war). DisallowConcurrentExecution und/oder PersistJobDataAfterExecution ist der Weg zu gehen. – aProgger

Verwandte Themen