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 ...
StatefulJob veraltet ist (weiß nicht, ob es 05,2015 war). DisallowConcurrentExecution und/oder PersistJobDataAfterExecution ist der Weg zu gehen. – aProgger