web-dev-qa-db-fra.com

Travail planifié Java Quartz - Interdit l'exécution simultanée du travail

J'utilise un travail Quartz pour l'exécution de tâches spécifiques. 

Je programme également son exécution dans ma classe d'application principale et ce que j'essaie d'accomplir est de ne pas autoriser l'exécution simultanée d'instances de ce travail.

Le planificateur ne doit donc exécuter le travail que si son instance précédente est terminée.

Voici ma classe d'emploi:

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

    }
}

Donc, dans la classe principale de mon application, je lance le planificateur:

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

}

Je voudrais empêcher le planificateur de démarrer une deuxième instance de MainJob si une autre instance est toujours en cours d'exécution ...

11
thanili

Utilisez simplement l'annotation @DisallowConcurrentExecution au-dessus de la classe Job.

Voir cet officiel exemple ou ce tutoriel sur l'exécution simultanée de travaux.

22
zerologiko

Vous pouvez implémenter StatefulJob ou annoter DisallowConcurrentExecution

4
Matt Stephenson

@DissallowConcurrentExecution peut faire votre travail, mais considérez que cela empêcherait seulement que votre classe soit exécutée deux fois sur le même noeud.

Veuillez consulter le commentaire @ReneM dans Planificateur multiple Quartz 2.2 et @DisallowConcurrentExecution

1
Alireza Fattahi