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 ...
Vous pouvez implémenter StatefulJob ou annoter DisallowConcurrentExecution
@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