2015-03-05 37 views
6

Używam zadania kwarcowego do wykonywania określonych zadań.Zaplanowane zadanie Java Quartz - zabroń wykonywania równoczesnego Job

Planuję również jego wykonanie w mojej głównej klasie aplikacji, a to, co próbuję wykonać, nie pozwala na jednoczesne wykonanie tego zadania.

W związku z tym program planujący powinien wykonywać zadanie tylko po zakończeniu poprzedniej instancji.

Oto moja klasa Praca:

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

    } 
} 

więc w głównej klasie mojej aplikacji Jestem od harmonogramu:

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

} 

chciałbym zapobiec planującego z rozpoczęciem drugiej instancji MainJob jeśli inna jeden nadal działa ...

Odpowiedz

13

Po prostu użyj adnotacji @DisallowConcurrentExecution na górze klasy Job.

Zobacz oficjalne example lub to tutorial o równoczesnym wykonywaniu zleceń.